如何用PHP模拟登录并抓取数据 ?

admin3个月前 (10-09)未分类213

使用PHP的Curl扩展库可以模拟实现登录,并抓取一些需要用户账号登录以后才能查看的数据。具体实现的流程如下


1. 首先需要对相应的登录页面的html源代码进行分析,获得一些必要的信息:

1)登录页面的地址;

2)验证码的地址;

3)登录表单需要提交的各个字段的名称和提交方式;

4)登录表单提交的地址;

5)另外要需要知道要抓取的数据所在的地址。


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

$login_url = 'http://www.xxxxx';  //登录页面地址

$cookie_file = dirname(__FILE__)."/pic.cookie";  //cookie文件存放位置(自定义)

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $login_url);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);

curl_exec($ch);

curl_close($ch);


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

$verify_url = "http://www.xxxx";   //验证码地址

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $verify_url);

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$verify_img = curl_exec($ch);

curl_close($ch);

$fp = fopen("./verify/verifyCode.png",'w');  //把抓取到的图片文件写入本地图片文件保存

fwrite($fp, $verify_img);

fclose($fp);


说明:

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


4. 模拟提交登录表单:

$ post_url = 'http://www.xxxx';   //登录表单提交地址

$post = "username=$account&password=$password&seccodeverify=$verifyCode";//表单提交的数据(根据表单字段名和用户输入决定)

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $ post_url);

curl_setopt($ch, CURLOPT_HEADER, false);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $post);     //提交方式为post

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

curl_exec($ch);

curl_close($ch);


5. 抓取数据:

$data_url = "http://www.xxxx";   //数据所在地址

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $data_url);

curl_setopt($ch, CURLOPT_HEADER, false);

curl_setopt($ch, CURLOPT_HEADER, 0);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,0);

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

$data = curl_exec($ch);

curl_close($ch);


到目前为止,已经把数据所在地址的这个页面都抓取下来存储在字符串变量$data中了。

需要注意的是抓取下来的是一个网页的html源代码,也就是说这个字符串中不仅包含了你想要的数据,还包含了许多的html标签等你不想要的东西。

所以如果你想要从中提取出你需要的数据的话,你还要对存放数据的页面的html代码进行分析,然后结合字符串操作函数、正则匹配等方法从中提取出你想要的数据。


以上方法对使用http协议的一般网站是有效的。但是如果你要模拟登录的是使用了https协议的网站的话还需要添加如下一些处理:

1. 跳过https验证:

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);


2. 使用用户代理:

$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)';

curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);


注意:如果不添加这些处理的话模拟登录时是不能成功的。

使用以上程序模拟登录网站一般都是能成功的,但是实际上还是需要针对模拟登录的网站具体情况具体考虑。


例如:有些网站编码不同,所以你抓取下来的页面是乱码的,这时就要进行一下编码转换,如:$data = iconv("gb2312", "utf-8",$data);,把gbk编码转换为utf8编码。还有一些对安全性要求比较高的网站,建议此内容只做学习参考!



相关文章

巧用CircleSNS,大学校园也能轻松开启创业智能赚!

巧用CircleSNS,大学校园也能轻松开启创业智能赚!

人在江湖飘没有两把刷子怎么行众 所 周 知CircleSNSCircleSNS是一款基于UNIAPP开发的社交平台程序工具。在数字化浪潮的推动下,校园市场正迎来前所未有的创业机遇。作为一名有远见的创业...

PHP实现在线更新功能/热更新,实例代码 thinkphp在线更新功能

PHP实现在线更新功能/热更新,实例代码 thinkphp在线更新功能

PHP实现在线更新功能,一个主方法,一个文件下载方法线上项目,实测:public function update() {// 这里省略了版本判断逻辑,根据自己需...

微信小程序上拉加载、下拉刷新的使用方法

微信小程序上拉加载、下拉刷新的使用方法

一、定义数据data() {return {list: [],      //数据列表noMore: ...

记录一次 if-else 代码优化的完整过程

记录一次 if-else 代码优化的完整过程

让我们来探讨一下如何将出租车叫车应用中的司机分配逻辑,从复杂的嵌套 if 语句中简化,使之更加清晰和易于维护。在之前的项目中,我参与了一款至今仍被广泛使用的出租车叫车应用的开发,虽然我不清楚他们现在使...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。