php是这样子模拟登录并抓取数据的

优采云 发布时间: 2022-08-11 22:50

  php是这样子模拟登录并抓取数据的

  点击进入“PHP开源社区” 免费获取进阶面试、文档、视频资源使用PHP的Curl扩展库可以模拟实现登录,并抓取一些需要用户账号登录以后才能查看的数据。具体实现的流程如下

  1. 首先需要对相应的登录页面的html源代码进行分析,获得一些必要的信息:1)登录页面的地址;2)验证码的地址;3)登录表单需要提交的各个字段的名称和提交方式;4)登录表单提交的地址;5)另外要需要知道要抓取的数据所在的地址。

  2. 获取cookie并存储(针对使用cookie文件的网站)

  $login_url = 'http://www.xxxxx';  //登录页面地址<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$cookie_file = dirname(__FILE__)."/pic.cookie";  //cookie文件存放位置(自定义)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ch = curl_init();<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_URL, $login_url);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_HEADER, 0);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_exec($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_close($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />

  3. 获取验证码并存储(针对使用验证码的网站)

  $verify_url = "http://www.xxxx";   //验证码地址<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ch = curl_init();<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_URL, $verify_url);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_HEADER, 0);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$verify_img = curl_exec($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_close($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$fp = fopen("./verify/verifyCode.png",'w');  //把抓取到的图片文件写入本地图片文件保存<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />fwrite($fp, $verify_img);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />fclose($fp);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />

  

  说明:由于不能实现验证码的识别,所以我这里的做法是,把验证码图片抓取下来存放到本地文件中,然后在自己项目中的html页面中显示,让用户去填写,等用户填写完账号、密码和验证码,并点击提交按钮之后再去进行下一步的操作。

  4. 模拟提交登录表单:

  $ post_url = 'http://www.xxxx';   //登录表单提交地址<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$post = "username=$account&password=$password&seccodeverify=$verifyCode";//表单提交的数据(根据表单字段名和用户输入决定)<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ch = curl_init();<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_URL, $ post_url);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_HEADER, false);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_POSTFIELDS, $post);     //提交方式为post<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_exec($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_close($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />

  5. 抓取数据:

  $data_url = "http://www.xxxx";   //数据所在地址<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$ch = curl_init();<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_URL, $data_url);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_HEADER, false);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_HEADER, 0);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_RETURNTRANSFER,0);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />$data = curl_exec($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_close($ch);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />

  到目前为止,已经把数据所在地址的这个页面都抓取下来存储在字符串变量$data中了。需要注意的是抓取下来的是一个网页的html源代码,也就是说这个字符串中不仅包含了你想要的数据,还包含了许多的html标签等你不想要的东西。所以如果你想要从中提取出你需要的数据的话,你还要对存放数据的页面的html代码进行分析,然后结合字符串操作函数、正则匹配等方法从中提取出你想要的数据。以上方法对使用http协议的一般网站是有效的。但是如果你要模拟登录的是使用了https协议的网站的话还需要添加如下一些处理:1. 跳过https验证:

  

  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />

  2. 使用用户代理:

  $UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />.NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705;<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /> .NET CLR 1.1.4322)';<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);<br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />

  注意:如果不添加这些处理的话模拟登录时是不能成功的。使用以上程序模拟登录网站一般都是能成功的,但是实际上还是需要针对模拟登录的网站具体情况具体考虑。例如:有些网站编码不同,所以你抓取下来的页面是乱码的,这时就要进行一下编码转换,如:$data = iconv("gb2312", "utf-8",$data);,把gbk编码转换为utf8编码。还有一些对安全性要求比较高的网站,建议此内容只做学习参考!

  *声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜

  END<p style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;clear: both;min-height: 1em;"><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /><br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" />PHP开源社区

  扫描关注  进入”PHP资料“

  免费获取进阶

  面试、文档、视频资源    

  <br style="margin: 0px;padding: 0px;outline: 0px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;" /></p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线