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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos系统大量time wait占用的解决

    centos系统大量time wait占用的解决统计在一台前端机上高峰时间TCP连接的情况,统计命令:netstat-n|awk’/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}’除了ESTABLISHED,可以看到连接数比较多的几个状态是:FIN_WAIT1,TIME_WAIT,CLOSE_WAIT,SYN_RECV和…

    2022年5月9日
    251
  • 到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?

    到底什么是hash呢?hash碰撞?为什么HashMap的初始容量是16?一,到底什么是hash呢?作者:知乎用户链接:https://www.zhihu.com/question/26762707/answer/40119521来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。hash(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的…

    2022年6月16日
    43
  • 同步调用与异步调用

    同步调用与异步调用同步调用和异步调用是两种提交任务的方式同步调用:提交完任务后,就在原地等待任务执行完毕,拿到运行结果/返回值后再执行下一步,同步调用下任务是串行执行。异步调用:提交完任务后,不会再原地等待任务执行完毕,直接执行下一行代码,异步调用时并发执行。异步调用,几乎同时下达任务fromconcurrent.futuresimportProcessPoolExecutorimport…

    2022年7月11日
    24
  • sqlcipher加密原理_sqlserver数据库加密

    sqlcipher加密原理_sqlserver数据库加密使用 sqlcipher.exe可以在输入密码后,查看加密数据库的内容。但是要编码查询数据库的内容,还要另寻方法。(相关的工具和库在我的百度网盘中)使用sqlcipherwindow

    2022年8月5日
    5
  • Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    2021年9月16日
    60
  • haxm failed to open driver

    haxm failed to open driver今天在新的PC机上,安装android环境。PC的配置是CPU:i5,8G内存。在装intelhaxm-android.exe时候出错(见下图)。尝试:首先,查看了BIOS中对VT的支持,确定是支持并且开启状态。然后在网上试了安装haxm_extra_workaround.zip的方式,仍然不起作用。解决办法:重新安装另外一个版本的HAXM,见网址。安装后,成功解决。

    2022年6月28日
    23

发表回复

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

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