编 写:袁 亮 时 间:2015-07-09 说 明:curl请求伪造信息及其他小知识点 一、为什么需要伪造? 在抓取的过程中,经常会出现被人屏蔽,不给抓了,这个时候,我们需要让自己尽量像是一个正常的用户去抓取相应数据 二、伪造哪些信息? 1、useragent 1.1 最初级的,所有浏览器、app都会带上自己的ua信息,如果没有,那就是直接告诉别人,我不是一个正常访问 1.2 curl_setopt($ci, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0'); 1.3 ua内容,可以使用firebug,查看网络中的请求头信息,复制下来即可,也可以准备多个,随机使用 2、referer 2.1 浏览器告知服务端,上一个请求的链接是什么;特别是在图片的抓取上,很多网站都会判断referer是不是自己的网站 2.2 根据网址,自动伪造首页referer $urlinfo = parse_url($url); $host = $urlinfo["scheme"].'://'.$urlinfo['host']; curl_setopt ($ch, CURLOPT_REFERER, $host); 3、cookie 3.1 很多网站需要登录才能显示内容,这个时候,就需要伪造相应的登陆cookie,否则抓取不到内容 3.2 主要两种办法:一个是在浏览器里登陆相应的账号,从firebug等,查看请求头里的cookie内容,复制下来 第二种是使用账号密码,在curl中,模拟登陆,然后将cookie存到txt文件里,下次将cookie带上去抓取数据 3.3 第一种比较快捷方便,特别是有验证码的网站,适合短时间抓取,但可能会因为cookie失效等原因出问题 第二种,如果有验证码会很麻烦,但是优点在于只要账号密码不出问题,程序就很少出问题 3.4 第一种代码: curl_setopt ($ch, CURLOPT_COOKIE, 'BAIDUID=7268C693B1F385AC297F677E90E092D4:FG=1;BIDUPSID=6093A44AECD856D0FFBD012FA16D99BA; PSTM=1436169100; BD_UPN=13314352;BDUSS=VRFdUMyRndUWmdkLUxrTW5-d0NjSVZocktDVHdublh1SFhqRTFHSlB3c2piTVJWQVFBQUFBJCQAAAAAAAAAAAEAAAD6lOAweXVhbmxpYW5nODQ3XzEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACPfnFUj35xVd;BD_HOME=1;H_PS_PSSID=11194_1442_14601_16148_13245_16035_10813_14429_10211_12868_16167_14667_16210_14954_15397_11465_13932_13612;BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0;BD_CK_SAM=1;__bsi=15490895447769138228_00_3_R_N_25_0303_C02F_N_I_I_0'); 3.5 第二种 伪造登陆的请参考阶段三,form表单伪造,cookie保存和下次使用就下面两段代码,注意文件写权限问题 curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file); //连接结束后保存cookie信息的文件。 curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file); 4、使用代理访问 4.1 很多网站,都会对同一个ip的访问次数和频率做限制,这个时候可以使用代理来隐藏我们的ip 4.2 代理有很多种,具体的参考其他文档,网上找的免费代理经常失效,不稳定,所以保持代理库的及时更新非常重要 4.3 使用方法 curl_setopt($curl, CURLOPT_PROXY, '代理ip:代理端口'); 5、伪造ip 5.1 将自己作为代理的一层,伪造header中的x-forwared-for来达到 5.2 关于ip的相关知识,可以搜索查看其他文档 5.3 采用的伪造头信息来达到目标,上面的那些伪造也可以使用这个方法达成,只要对http头熟悉即可 $header = array( 'X-FORWARDED-FOR:202.103.229.40', '...'//其他需要伪造的,再加一行即可 ); curl_setopt ($ch, CURLOPT_HTTPHEADER , $header ); //构造IP 三、curl超时 1、所有curl请求,必须设置超时时间,否则很容易导致进场堆积,将服务器拖垮 2、超时有两个,一个是连接超时,一个是传输内容超时,都必须要设置 3、设置代码: curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT , 2 );//连接时间 curl_setopt ($ch, CURLOPT_TIMEOUT , 3 );//最长执行时间 四、跟踪链接跳转 1、抓取的时候,会出现目标被header跳转 2、跳转的代码在header中获取 curl_setopt($ch,CURLOPT_HEADER,true);//将头信息输出,默认只输出http的body部分(非html的body) curl_setopt($ch,CURLOPT_NOBODY,true);//不输出body数据,如果确定有location跳转的话用,一般情况下不要设置 3、设置代码: curl_setopt ($ch, CURLOPT_FOLLOWLOCATION , true );//跟随跳转 curl_setopt ($ch, CURLOPT_MAXREDIRS , 2 );//跳转次数限制,防止死循环等