• 售前

  • 售后

热门帖子
入门百科

PHP利用Curl实现模拟登录及抓取数据功能示例

[复制链接]
蓝胖子685 显示全部楼层 发表于 2021-10-25 20:17:22 |阅读模式 打印 上一主题 下一主题
本文实例报告了PHP使用Curl实现模仿登录及抓取数据功能。分享给大家供大家参考,具体如下:
使用PHP的Curl扩展库可以模仿实现登录,并抓取一些须要用户账号登录以后才能查看的数据。具体实现的流程如下(个人总结):
1. 起首须要对相应的登录页面的html源代码进行分析,得到一些须要的信息:
(1)登录页面的地点;
(2)验证码的地点;
(3)登录表单须要提交的各个字段的名称和提交方式;
(4)登录表单提交的地点;
(5)别的要须要知道要抓取的数据所在的地点。
2. 获取cookie并存储(针对使用cookie文件的网站):
  1. $login_url = 'http://www.xxxxx';  //登录页面地址
  2. $cookie_file = dirname(__FILE__)."/pic.cookie";  //cookie文件存放位置(自定义)
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, $login_url);
  5. curl_setopt($ch, CURLOPT_HEADER, 0);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  7. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
  8. curl_exec($ch);
  9. curl_close($ch);
复制代码
3. 获取验证码并存储(针对使用验证码的网站):
  1. $verify_url = "http://www.xxxx";   //验证码地址
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, $verify_url);
  4. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
  5. curl_setopt($ch, CURLOPT_HEADER, 0);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  7. $verify_img = curl_exec($ch);
  8. curl_close($ch);
  9. $fp = fopen("./verify/verifyCode.png",'w');  //把抓取到的图片文件写入本地图片文件保存
  10. fwrite($fp, $verify_img);
  11. fclose($fp);
复制代码
阐明:
由于不能实现验证码的识别,以是我这里的做法是,把验证码图片抓取下来存放到本地文件中,然后在本身项目中的html页面中表现,让用户去填写,等用户填写完账号、暗码和验证码,并点击提交按钮之后再去进行下一步的操纵。
4. 模仿提交登录表单:
  1. $ post_url = 'http://www.xxxx';   //登录表单提交地址
  2. $post = "username=$account&password=$password&seccodeverify=$verifyCode";//表单提交的数据(根据表单字段名和用户输入决定)
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_URL, $ post_url);
  5. curl_setopt($ch, CURLOPT_HEADER, false);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  7. curl_setopt($ch, CURLOPT_POSTFIELDS, $post);     //提交方式为post
  8. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
  9. curl_exec($ch);
  10. curl_close($ch);
复制代码
5. 抓取数据:
  1. $data_url = "http://www.xxxx";   //数据所在地址
  2. $ch = curl_init();
  3. curl_setopt($ch, CURLOPT_URL, $data_url);
  4. curl_setopt($ch, CURLOPT_HEADER, false);
  5. curl_setopt($ch, CURLOPT_HEADER, 0);
  6. curl_setopt($ch, CURLOPT_RETURNTRANSFER,0);
  7. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
  8. $data = curl_exec($ch);
  9. curl_close($ch);
复制代码
到现在为止,已经把数据所在地点的这个页面都抓取下来存储在字符串变量$data中了。
须要注意的是抓取下来的是一个网页的html源代码,也就是说这个字符串中不但包罗了你想要的数据,还包罗了许多的html标签等你不想要的东西。以是如果你想要从中提取出你须要的数据的话,你还要对存放数据的页面的html代码进行分析,然后联合字符串操纵函数、正则匹配等方法从中提取出你想要的数据。
以上方法对使用http协议的一样平常网站是有效的。但是如果你要模仿登录的是使用了https协议的网站的话还须要添加如下一些处置处罚:
1. 跳过https验证:
  1. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  2. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
复制代码
2. 使用用户署理:
  1. $UserAgent = 'Mozilla/4.0 (compatible; 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)';
  2. curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);
复制代码
注意:如果不添加这些处置处罚的话模仿登录时是不能成功的。
使用以上程序模仿登录网站一样平常都是能成功的,但是实际上还是须要针对模仿登录的网站具体情况具体思量。例如:有些网站编码不同,以是你抓取下来的页面是乱码的,这时就要进行一下编码转换,如:
  1. $data = iconv("gb2312", "utf-8",$data);
复制代码
,把gbk编码转换为utf8编码。尚有一些对安全性要求比力高的网站,比如网银,会把验证码放在一个内联框架中,这时你就须要先抓取到内联框架的页面然后在从中提取出验证码的地点,再去抓取验证码。尚有一些网站(比如网银)是在js代码中去提交表单的,提交表单之前还会去做一些处置处罚,比如加密等,以是如果你是直接提交的话也是不能登录成功的,你必须要去做类似的处置处罚后再提交,但是这种情况如果你能知道js代码中进行的具体操纵,比如加密的话,加密算法是怎样的,你就可以进行跟它一样的处置处罚,然后再去提交数据,这样也是能成功的。但是,关键的地方来了,如果你根本不知道它进行的是什么操纵,比如它进行了加密,但是你不知道加密的具体算法,那么你就无法进行类似的操纵,也就不能成功地模仿登录了。这方面典范的案例就是网银,它在js代码中提交表单之前使用网银控件对用户提交的暗码和验证码进行了一些处置处罚,但是我们根本不知道它进行的是什么操纵,以是无法模仿。以是如果你以为你看了本文之后就能模仿登录网银的话那么你就太机动了,人家银行的网站能那么容易被你模仿登录吗?固然,如果你能破解网银控件的话,那就另当别论了。话说回来,为什么我的感受如此深刻,由于我就遇到这个难题了,不说了,说多了都是泪啊。。。
更多关于PHP相干内容感爱好的读者可查看本站专题:《php curl用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操纵技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设盘算法总结》、《PHP运算与运算符用法总结》及《php常见数据库操纵技巧汇总》
希望本文所述对大家PHP程序计划有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作