编 写:袁 亮 时 间:2015-07-17 说 明:curl番外:linux命令行下使用 一、常用命令 1、直接抓取网页 curl http://www.ci123.com 2、抓取数据,并保存成文件 curl -O http://192.168.0.62/yl/curl/demo.php //需要后面有具体文件名,否则抓取不到 curl -o index.html http://www.ci123.com 3、仅显示http响应头 curl -I http://www.ci123.com 4、发送post数据 4.1 普通post curl -d "username=name&nickname=暗夜御林" http://192.168.0.62/yl/curl/demo.php 4.2 上传文件的时候,-F每次只能设置一个参数项,不能多个,文件名用@符号加载地址前 curl -F "file=@51268106.html" -F "username=name" -F "nickname=暗夜御林" http://192.168.0.62/yl/curl/demo.php 5、模拟登陆,使用cookie文件夹 5.1 将cookie写入到本地文件(使用-F可以) curl -c cookie.txt http://192.168.0.62/yl/curl/demo.php curl -D cookie.txt http://192.168.0.62/yl/curl/demo.php //直接将响应头存储进文件 5.2 使用本地存储的cookie文件发送请求 curl -b cookie.txt http://192.168.0.62/yl/curl/demo.php 6、伪造referer curl -e 'http://www.baidu.com' http://192.168.0.62/yl/curl/demo.php 7、使用代理访问(找免费代理,翻墙出去,google搜索比较给力) curl -x 124.202.183.170:8118 http://www.baidu.com
标签: curl
curl:抓取https数据
编 写:袁 亮 时 间:2015-07-15 说 明:使用curl抓取https数据 一、为什么需要? 未了安全考虑,很多网站使用了https域名 https需要客户端和服务端都做openssl的验证 二、抓取设置 1、方法一,设置为不验证证书【直接用这个,除非安全性要求特别高】 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); ps:抓百度的时候需要注意,referer设置为百度本身的返回会又问题,可以自己尝试看看 2、设置一个正确的证书验证 2.1 下载最新的证书到本地 wget http://curl.haxx.se/ca/cacert.pem 2.2 设置使用证书 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,true); ; curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem'); 三、一些错误情况(出错的情况下,开启curl_error($ch)查看) 1、centos系统,如果不知道证书地址,则使用系统证书 /etc/pki/tls/certs/ca-bundle.crt 2、如果系统证书过期,或者错误,则会显示签名出错 通过wget http://curl.haxx.se/ca/cacert.pem 来更新最新的证书 3、显示“段错误”,有可能是libcurl和php版本不一致导致 线上centos 6.2和php 5.2.17,出现过该问题 4、当不能确定是否是某台服务器出问题的时候,写个简单的demo,分别在几台服务器运行看下是否有问题 四、尚未解决 1、采用浏览器下载或者导出的证书,在程序中一直未能使用成功
curl阶段三:模拟用户表单提交数据
编 写:袁 亮 时 间:2015-07-10 说 明:curl高阶应用,模拟用户表单提交数据 一、应用场景 1、伪装用户登录,爬取需要登录才能访问的数据 2、提交表单,进行一些操作,比如自动发帖等,刷刷投票什么的 3、内部接口调用,模拟提交数据,作为参数 二、get传送 没什么好说的,直接在链接后面拼起来就好了 三、post数据传送 1、form表单提交数据,编码设置,直接参考w3cschool application/x-www-form-urlencoded 在发送前编码所有字符(默认) multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。 text/plain 空格转换为 "+" 加号,但不对特殊字符编码。 2、一般的表单项 2.1 采用的是第一编码方式 2.2 代码使用: $data = array( 'title' => '大家好,我是新人,请多多关照', 'content' => '第一次来这边,发现好多东西好有帮助...', ); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//Post提交的数据包 3、文件上传 3.1 代码和上面一样 3.2 文件地址使用@符合加载绝对路径之前即可,先绝对路径,否则很容易出错 3.3 例如: $data = array( 'title' => '大家好,我是新人,请多多关照', 'content' => '第一次来这边,发现好多东西好有帮助...', 'photo' => '@/opt/ci123/www/html/ciphot/demo.jpg', ); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//Post提交的数据包 3.4 还有个参数 CURLOPT_UPLOAD,没用过,有兴趣可以自己了解下 四、http basic验证 1、有些项目或者网站,访问的时候加了http basic验证,直接抓取会失败 2、知道账号密码的话,简单设置下即可 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "username:password"); 五、错误信息显示 1、在exec执行之后,如果出错,可以返回报错信息方便查看 $img = curl_exec($ch); $err = curl_error($ch); if($err){ return $err; } 2、很少用,一般是在上传图片的时候,图片路径出错会出这个问题 3、curl抓取不到,请注意是否能ping的通域名,能否正常访问那个文件,ping一下,或者wget下那个地址 4、ipv6报错提示:curl: (6) Couldn't resolve host(域名能正常访问的话),设置使用ipv4的 curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4)
curl阶段二:伪造请求信息及其他小知识
编 写:袁 亮 时 间: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 );//跳转次数限制,防止死循环等
curl阶段一:简单使用
编 写:袁 亮 时 间:2015-07-09 说 明:curl的初阶使用 一、curl是干什么的? 当我们需要在程序中,抓取其他网页或者图片等远程数据的时候,可以使用curl完成一些比较强大的功能 ps:如果要求不高,只是简单的抓取,可以使用file_get_contents来抓取 二、开启扩展 ps:确定是否有该扩展,很简单,写个php文件,里面价格curl_init();运行是否报错,如果报错则需要开启扩展 1、windows下开启,以appserv为例 1.1 将以下三个文件复制到C:\Windows\system32\下 AppServ\php5\ext\php_curl.dll AppServ\php5\libeay32.dll AppServ\php5\ssleay32.dll 1.2 找到C:\Windows\php.ini文件(phpinfo函数输出的内容中,有php.ini文件的位置) extension=php_curl.dll 将这行前面的;号注释去掉 1.3 重启apache,appserv中有apache restart的功能 2、linux 虚拟机上的话重新编译php的curl模块 线上服务器,直接找运维同学帮忙安装即可 三、简单使用 1、简单函数 function curl($url){//curl模拟浏览器方式数据 $urlinfo = parse_url($url); $host = $urlinfo["scheme"].'://'.$urlinfo['host']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不直接输出,作为变量返回 curl_setopt($ch, CURLOPT_REFERER, $host);//模拟referer,防止被禁止,抓取图片的时候非常有用 curl_setopt($ch, CURLOPT_TIMEOUT,3);//内容传输的最长时间,一定要设置 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,3);//连接的最长时间,一定要设置 $img = curl_exec($ch); return $img; } 2、使用 $html = curl('网页、图片等地址');