curl抓取页面时遇到重定向的解决方法

curl抓取页面时遇到重定向的解决方法

大家好,又见面了,我是全栈君。

用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下:

<?php
function curlGet($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, true);
return curl_exec($ch);
}

$url = 'http://144go.com';
echo curlGet($url), "\n";

代码的目的很简单,抓取页面:http://www.144go.com
执行上述代码,得到的结果:

HTTP/1.1 301 Moved Permanently
Content-Length: 144
Content-Type: text/html
Location: http://www.144go.com/
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Mon, 03 Sep 2012 04:25:22 GMT
 
<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="http://www.144go.com/">here</a></body>

由结果中的
Location: http://www.144go.com/
可知http://144go.com被重定向到了http://www.144go.com/
怎么办呢,要用正则分析出Location部分的链接,重复执行执行curlGet吗?行到是行,就是有点麻烦。

其实只要加一条语就可以了:

<?php
function curlGet($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, true);
  //函数中加入下面这条语句
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
return curl_exec($ch);
}

再次执行代码,可以抓取到想要的页面。
CURLOPT_FOLLOWLOCATION指明:
让curl递归的抓取http头中Location中指明的url。
当抓取次数超过CURLOPT_MAXREDIRS时,递归将终止。
在抓取中任何跳转带来的问题,都可通过设置此参数解决。

有关重定向的问题,可参考HTTP返回码中301与302的区别
———————

原文链接:https://blog.csdn.net/qmhball/article/details/7937534

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112126.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月10日 上午9:00
下一篇 2022年2月10日 上午9:00


相关推荐

  • web网络聊天室

    web网络聊天室花了四天时间做了一个简单的web聊天室前端页面效果大概是下面这个样子1.登陆界面2.注册界面这里首先会检查用户名是否重复,如果重复,会提示你用户名已存在反正显示可用3.聊天室界面登陆成功会在左边显示登陆人的名称以及当前在线人数。然后在下面可用选择对谁说以及一些文字表情,字体颜色什么的4.聊天功能会显示发送者名称,以及对谁说,语气词,以及发送时间最后总结一下做的…

    2022年6月22日
    29
  • JavaScript动态主题与CSS变量交互教程

    JavaScript动态主题与CSS变量交互教程

    2026年3月13日
    2
  • k8s 开源_jdk源码剖析手册

    k8s 开源_jdk源码剖析手册createfunc main() { #随机数 rand.Seed(time.Now().UnixNano()) #创建一个新的命令行对象 command := cmd.NewDefaultKubectlCommand() #日志 logs.InitLogs() defer logs.FlushLogs() #真正执行的命令行 if err := command.Execute(); err != nil { os.Exit(1) }}# NewDefaultKubectl

    2022年8月11日
    6
  • IDEA 使用Git Clone项目

    IDEA 使用Git Clone项目1 查看 Git 是否存在 3 从 Gitlab 克隆项目到本地 4 点击 Git 后 输入你的 url 可以点击 Test 测试一下 5 导入项目成功

    2025年12月8日
    7
  • sdn小结(一)_SDN的基本概念

    sdn小结(一)_SDN的基本概念看了一周的sdn,写下一点总结和心得体会。1.sdn中不一定非得用openflow来作为南向协议,其他的南向接口协议还有很多,比如pcep,netconf,snmp,bgp-ls2.segmentrouting也需要一个集中的控制器,只要硬件条件支持,sr可以和sdn进行结合3.ECMP通过对流的数据包头部进行哈希取模运算,将数据流映射到不同的转发路径4.谷歌的B4采取的是i…

    2025年9月24日
    7
  • Echarts中国地图与世界地图实战

    Echarts中国地图与世界地图实战文章目录前言一 先上代码 1 中国地图 2 世界地图二 图示 1 中国地图 2 世界地图二 Echarts 简介 1 介绍 2 实战流程 1 引入 echarts js2 定义一个图表容器 DIV 定义 id xxx3 初始化 echarts 对象并绑定到该容器 xxx 上 4 给绑定的 echarts 容器配置图表参数来展示数据 3 学习网址总结前言 Echarts 中中国地图与世界地图实战 完整代码 一 先上代码其中 china js 与 world js 两个文件已通过 CDN 的方法给出 而 echarts js 大家可以自行去

    2026年3月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号