php crulwireshark抓取ip地址网页太多ip被封 怎么办

UserAgent设置不当导致php抓取网页失败
作者:admin&&&&时间: 21:44:40&&&&浏览:
php抓取网页,可谓轻而易举,几行代码就可以搞定。不过,如果你有所疏忽,程序写得不够严密,就会出现有的网页抓取成功有的网页却抓不了的问题。先来看看php抓取代码的一个方法:&?php$curl = curl_init();curl_setopt($curl, CURLOPT_URL, &/&);$data = curl_exec($curl);?&代码中$data就是要抓取的网页html代码了。但是如果使用这个程序去抓取网页文件,无疑是十分脆弱的。这可能对抓取大多数网页没有什么问题,但是某些网页,你会抓不到目标文件,取而代之的抓到意想不到的网页代码。这是什么原因呢?其实,curl_setopt()的可选参数有的是十分重要的,在抓取网页这部分,有一个参数我们必须要考虑进去,那就是UserAgent。什么是UserAgent?UserAgent简称(UA),是一个只读的字符串,它声明了浏览器用于 HTTP 请求的用户代理头的值。简单来说,就是&声明用什么浏览器来打开目标网页&。说到这里,可能有的人会意识到不同的UserAgent会得到不同的网页请求了,例如手机浏览器和PC浏览器,就会得到不同的网页文件。举个例子,假如PC浏览器和手机浏览器,打开,就会得到不同的结果页,这其实就是UserAgent的不同的结果。居于这个原因,卡卡测速网的程序就使用了用户自定义UA的网页抓取程序。好了,说到这里,我想大家都明白上述代码应该怎样修改了吧。正确的写法应该是这样的:&?php$UserAgent = 'Mozilla/4.0 ( MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'$curl = curl_init();curl_setopt($curl, CURLOPT_URL, &/&);curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);$data = curl_exec($curl);?&上述代码声明使用IE浏览器打开网页。
当然,你也可以声明用Firefox的UserAgent打开网页,代码如下:$UserAgent = 'Mozilla/5.0 (W U; Windows NT 5.2) Gecko/ Firefox/3.0.1';你还可以声明用其他UserAgent打开网页。下面是IE8的UserAgent:IE8 on Windows Vista (兼容浏览)Mozilla/4.0 ( MSIE 7.0; Windows NT 6.0; Trident/4.0)IE8 on Windows VistaMozilla/4.0 ( MSIE 8.0; Windows NT 6.0; Trident/4.0)IE8 on Windows 7Mozilla/4.0 ( MSIE 8.0; Windows NT 6.1; Trident/4.0)64-bit IE on 64-bit Windows 7:Mozilla/4.0 ( MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)32-bit IE on 64-bit Windows 7:Mozilla/4.0 ( MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)Firefox的UserAgent:Mozilla/5.0 (W U; Windows NT 5.2) Gecko/ Firefox/3.0.1 Mozilla/5.0 (W U; Windows NT 5.1) Gecko/ Firefox/2.0.0.3 Mozilla/5.0 (W U; Windows NT 5.1) Gecko/ Firefox/1.5.0.12Chrome的UserAgent:Mozilla/5.0 (W U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13Navigator的userAgent:Mozilla/5.0 (W U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/ Firefox/2.0.0.12 Navigator/9.0.0.6Safari的userAgent:Mozilla/5.0 (W U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13&Mozilla/5.0 (iP U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3Opera的userAgent:Opera/9.27 (Windows NT 5.2; U; zh-cn)&Opera/8.0 (M PPC Mac OS X; U; en)&Mozilla/5.0 (M PPC Mac OS X; U; en) Opera 8.0通过设置UserAgent,可以避免有的网页因UA不同而返回不同http请求的错误,让自己的抓取网页程序更加完善严密。
把文章分享到:
QQ交流群()php curl函数采集网页出现乱码问题解决方法-常见问题-Php教程-壹聚教程网php curl函数采集网页出现乱码问题解决方法
curl乱码有两个方面的原因一个是因为我们采集页面的php页面编码与远程文档编码不致导致的,另一种可能是页面进入了gzip压缩传输导致的,那么我们要如何解决这些问题呢?
gzip压缩传输导致乱码
今天在采集京东的时候发现返回的数据是乱码,网上说可能和压缩有关,看了一下京东的头信息的确进行gzip加密,好吧,那就解压吧
$return = gzdecode($return); //将return的字符进行解码
另一种解决办法
($ch, CURLOPT_ENCODING, 'gzip');
页面编码问题
mb_convert_encoding($str, 'utf-8', 'GBK,UTF-8,ASCII');就行了
上一页: &&&&&下一页:相关内容
暂无与此文章相关内容最新内容最近在做一些抓取其它网站数据的工作,当然别人不会乖乖免费给你抓数据的,有各种防抓取的方法。不过道高一尺,魔高一丈,通过研究都是有漏洞可以钻的。下面的例子都是用PHP写的,不会用PHP来curl的孩纸先学习一下这块再往下看,可以参考这篇文章:
& & & 下面言归正传,先说一种常见的方式,伪造来源IP,这也是好多刷票朋友常用的方法:
1、简单一点的可以在header伪造X-FORWARDED-FOR,并伪造referer,代码如下:
curl_setopt($ch,&CURLOPT_HTTPHEADER,&array('X-FORWARDED-FOR:111.222.333.4',&'CLIENT-IP:111.222.333.4'));&&
curl_setopt($ch,&CURLOPT_REFERER,&"");&&
2、上面的方法大多数能糊弄过去,但也有抓到了真实IP的。就使用代理,麻烦在于你有一个有效的代理ip和端口号,有的还需要用户名密码,代码如下:
curl_setopt($ch,&CURLOPT_PROXY,&"http://111.222.333.4:110");&&
& & & 另外还有一种情况,就是用浏览器可以访问,用curl就是不行,发现对方检查了useragent,如果没有就认为是抓取等非法来源,那么我们就自己在header加上useragent,代码如下:
curl_setopt($ch,&CURLOPT_USERAGENT,&"Mozilla/5.0&(Windows&NT&6.1)&AppleWebKit/536.11&(KHTML,&like&Gecko)&Chrome/20.0.1132.57&Safari/536.11");
阅读(...) 评论()21:24 提问
我用了curl代理,为什么抓取 显示的还是实际ip
这是我的代码我curl用了代理ip做抓取,按理说应该显示的是我代理的ip但是还是显示的我的本机IP。 有谁知道为什么
function get_html($url,$data=array(),$html_char='UTF-8',$is_ssh='http'){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_PROXY,'111.12.117.67');
curl_setopt($ch, CURLOPT_PROXYPORT,'83');
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('CLIENT-IP:113.207.63.26', 'X-FORWARDED-FOR:113.207.63.26'));
curl_setopt ($ch, CURLOPT_TIMEOUT, 6000);
curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (W U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/ Firefox/3.0');
if($is_ssh=='SSL'){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
if(!empty($data)){
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
if($html_char!='UTF-8'){
$output=mb_convert_encoding($output, "UTF-8", $html_char);
$info = curl_getinfo($ch);
curl_close($ch);
$returntemp = array('output'=&$output,'info'=&$info);
return $returntemp['output'];
$date=get_html($url);
按赞数排序
代理服务器如果设置了x-forward-for,并且报告你的原始ip,那么网站可以得到你的原始ip,被称为透明代理。不报告的叫做匿名代理
其他相似问题php curl获取网页内容(IPV6下超时)的解决办法
字体:[ ] 类型:转载 时间:
如果开启了IPv6,curl默认会优先解析 IPv6,在对应域名没有 IPv6 的情况下,会等待 IPv6 dns解析失败 timeout 之后才按以前的正常流程去找 IPv4
原因:在程序中我对curl获取内容都作了较为严格的超时限制,所以就会造成无法获取内容的问题。解决方法:设置默认访问为ipv4。php的curl设置方法如下: 代码如下:&?php/*** IPV6下curl超时问题*/$ch = curl_init();curl_setopt ($ch, CURLOPT_URL, $url);curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);//设置curl默认访问为IPv4if(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);}//设置curl请求连接时的最长秒数,如果设置为0,则无限curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);//设置curl总执行动作的最长秒数,如果设置为0,则无限curl_setopt ($ch, CURLOPT_TIMEOUT,$timeout*3);$file_contents = curl_exec($ch);curl_close($ch);注:curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4) 只有在php版本5.3及以上版本,curl版本7.10.8及以上版本时,以上设置才生效。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 wireshark抓取ip地址 的文章

 

随机推荐