如何用Curl模拟浏览器

本文讲述的是如何用Curl抓取网页,用PHP,Python,C,C#等道理都是一样的。其他信息可以去官网找 http://curlmulti.com

对于简单单纯的页面直接写程序抓取即可,很简单,但是很多时候这样是不行的,因为可能涉及到Cookie,Referer,表单,JS等一系列非常麻烦的操作,这时候就需要有效定位问题。类似问题中,见到最多一个问题是,如何用Curl模拟登陆?答案是:呵呵。

对于比较复杂的页面抓取,最有效的办法是Chrome(最好是Linux版或Mac版,windows版很有可能有bug)的开发者工具,本文以http://v.hao123.com/dianshi/为例讲述一下详细流程。

Chrome这里有个CentOS版的安装教程,其他版本自行google。

2014-11-01_144155
点开鼠标位置的Filter,中间位置的那个XHR是ajax请求。开发者工具有一个很吊的功能,见下图

2014-11-01_144247
再次强调一下windows版拷贝出来的命令可能有问题(新版本火狐浏览器也有这个功能了,如果chrome的有bug可以用火狐试试),拷贝的curl命令行命令如下:

curl "http://v.hao123.com/dianshi/" -H "Accept-Encoding: gzip,deflate,sdch" -H "Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4" -H "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "Cache-Control: max-age=0" -H "Cookie: BAIDUID=A5571E0790BFB2DBC44E4F27EFB2B7FD:FG=1; static=1; FLASHID=A5571E0790BFB2DBC44E4F27EFB2B7FD:FG=1; scrollflag=1414681499315; HUM=; HUN=; loc2=1"%"7C"%"E5"%"8C"%"97"%"E4"%"BA"%"AC"%"7C"%"E5"%"8C"%"97"%"E4"%"BA"%"AC; mtip=0; Hm_lvt_f60abe83e86964c3e30ba20fa7dc2709=1414680909,1414823686; Hm_lpvt_f60abe83e86964c3e30ba20fa7dc2709=1414823686" -H "Connection: keep-alive" --compressed

curl命令行是什么,怎么用自行google。执行之后会输出采集到的页面。
2014-11-01_1445512014-11-01_144608
curl命令行转换成php语法,python语法,c语法或其他什么语言的语法就没有什么技术含量了,比如以php为例:

-H参数对应CURLOPT_HTTPHEADER

curl_setopt(CURLOPT_HTTPHEADER,$ch,array("Accept-Encoding: gzip,deflate,sdch","Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4","User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36","Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Cache-Control: max-age=0",....));

CURLOPT_HTTPHEADER是一个通用选项,可以说是万能的,curl选项非常多,比如Cookie可以用CURLOPT_COOKIE,具体用法看php手册。
2014-11-01_145310

curl命令行的--compressed表示返回结果可以是压缩的,一般就是gzip或deflate格式, 可以用CURLOPT_ENCODING选项指定,这样返回内容自动解压,如果不指定,需要用php函数手动解压,比如gzuncompress()等
2014-11-01_145611

很简单吧!还有一种比较复杂的情况,就是可能有302,301之类的跳转或js跳转等,导致chrome不能捕捉到页面,当然网速慢的情况下可以按ESC在跳转页面停下,但是这个可操作性太差了,这就需要用抓包工具来搞了,比如Burp,Burp1.6专业版在官网的群共享文件里有。

Burp通过代理实现抓包:
2014-11-01_150359
设置浏览器代理
2014-11-01_150444
刷新浏览器burp就捕捉到请求了
2014-11-01_150601
其中的详细信息自己慢慢看,点击Forward按钮继续后面的请求,有所有请求信息了,再转换到程序里就是体力活了。

如何用Curl模拟浏览器》上有4条评论

发表评论

电子邮件地址不会被公开。

*