设为首页 加入收藏

TOP

如何get与post方式来采集网页
2017-01-24 09:27:14 来源: 作者:风之轨迹 【 】 浏览:245次 评论:0
复制正文内容

这节采集经验我分享如何用get与post两个常用访问网页的方式来采集一个网页的数据。
 我以下载一个百度网盘分享文件的步骤来分析下它的执行下载,它的下载原理包含了get,post两种常用的网页提交方法和htm与json两种网页常用的输出方法,学会这个百度网盘下载原理,网页的采集方法基本能采集多数网站了,下面我带大家来揭开它的下载步骤吧?。
首先找一个抓包工具来窥探它我们的客户端与百度网盘服务器是如何交互信息的,
推荐fiddler,这个工具功能强大,还可以手机抓包,以后再跟大家说如何手机抓包,现在先介绍电脑端的抓包,下载地址,
http://pan.baidu.com/share/link?shareid=1938665008&uk=2872165933
下载后解压,安装
fiddler2setup.exe
64位安装
fiddler4setup.exe
安装点击next,install这些,不具体说了,安装成功后启动软件,提示升级,点击no取消,
打开浏览器,我们以刚才的fiddler的百度网盘分享链接分析下是如何下载的,再次打开地址
http://pan.baidu.com/share/link?shareid=1938665008&uk=2872165933
注:这时复制下网页的原代码保存,后面说到如何从网页中摘取所需的参数
点击下载,再点击普通下载,好了,这样下载的步骤就被fiddler捕获了,
返回到fiddler,按alt弹出菜单,依次选择以下项目,
File
Save
All Sessions
Copy
或者按快捷键ctrl加shift加s复制采集信息,
我们首先了解那一些是客户端发送出去,那些是服务端反回给我们的,开头是'get'或者'post'是本机发送出去,'HTTP/1.1'开头就是服务器返回给我们的,
再看刚才的下载操作,是以'post'方式提交给服务器进行下载请求的,我就查找'post '开头的请求内容,找到这一段
POST http://pan.baidu.com/api/sharedownload?sign=3f352be4c05e49ae3883540b8a22d5f86808f49b&timestamp=1482195883&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=250528&logid=MTQ4MjE5NTkyNjk5MzAuOTEzNTcyNTIyNTEyMTYxOA== HTTP/1.1
Accept-Language: zh-CN
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
Connection: Keep-Alive
Content-Length: 89
Host: pan.baidu.com
Pragma: no-cache
Cookie: xxxxxxxxxxxx
encrypt=0&product=share&uk=2872165933&primaryid=1938665008&fid_list=%5B554772159527391%5D

这段有四条报头必要,
向服务器发送下载请求的链接:
http://pan.baidu.com/api/sharedownload?sign=3f352be4c05e49ae3883540b8a22d5f86808f49b&timestamp=1482195883&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=250528&logid=MTQ4MjE5NTkyNjk5MzAuOTEzNTcyNTIyNTEyMTYxOA==
本机客户端信息:
User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
发送的cookie:
Cookie: xxxxxxxxxxxx
post过去的参数:
encrypt=0&product=share&uk=2872165933&primaryid=1938665008&fid_list=%5B554772159527391%5Dencrypt=0&product=share&uk=2872165933&primaryid=1938665008&fid_list=%5B554772159527391%5D
然后写出来的php抓取代码如下:
<?php
$url="http://pan.baidu.com/api/sharedownload?sign=3f352be4c05e49ae3883540b8a22d5f86808f49b&timestamp=1482195883&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=250528&logid=MTQ4MjE5NTkyNjk5MzAuOTEzNTcyNTIyNTEyMTYxOA==";
$header=array('User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko','Cookie: xxxxxxxxxxxx');
$post_code="encrypt=0&product=share&uk=2872165933&primaryid=1938665008&fid_list=%5B554772159527391%5Dencrypt=0&product=share&uk=2872165933&primaryid=1938665008&fid_list=%5B554772159527391%5D";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$post_code");
$tp = curl_exec($ch);
curl_close($ch);
echo "$tp<br>";
//解码json,提取下载地址
$json=json_decode($tp);
$dlink=$json->list[0]->dlink;
echo $dlink;
?>
运行代码,可以看到服务器返回给的json数据与解码json后获取的下载链接。

知道了下载请求的方法,但我们不知道那条下载请求的链接与提交服务器的参数是如何获取的,首先了解下我们提交下载请求提交了那些重要参数,我列出几个重要的参数,
sign:3f352be4c05e49ae3883540b8a22d5f86808f49b
timestamp:1482195883
primaryid:1938665008
uk:2872165933
fid:554772159527391
这些参数都是从分享网页原代码提取出来,那就打开之前保存好的原代码文件,使用查找功能,反查下参数在那段htm代码中,
提取参数的原代码如下
<?php
$url='http://pan.baidu.com/api/sharedownload?sign=3f352be4c05e49ae3883540b8a22d5f86808f49b&timestamp=1482195883&bdstoken=null&channel=chunlei&clienttype=0&web=1&app_id=250528&logid=MTQ4MjE5NTkyNjk5MzAuOTEzNTcyNTIyNTEyMTYxOA==';
$header=array('User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko','Cookie: PANWEB=1; bdshare_firstime=1482155019721; Hm_lvt_7a3960b6f067eb0085b7f96ff5e660b0=1481633483,1481693571,1482155020,1482195886; Hm_lpvt_7a3960b6f067eb0085b7f96ff5e660b0=1482195886; BAIDUID=B1BAD8DBE89E03B135C93756AB3A4F13:FG=1; BIDUPSID=6D20C8557FF27655E90B61305E4BB85C; PSTM=1482112725; pgv_pvi=7977392128; H_PS_PSSID=1431_21081_21553_20718');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);

preg_match("/\"shareid\".(.*?)\,/",$data,$shareid);
$shareid=$shareid[1];
preg_match("/\"uk\".(.*?)\,/",$data,$uk);
$uk=$uk[1];
preg_match("/fs_id\":(.*?),/",$data,$a);
$fid=$a[1];
preg_match("/timestamp\":(.*?),/",$data,$b);
$filetime=$b[1];
preg_match("/sign\".\"(.*?)\"/",$data,$c);
$sign=$c[1];
?>


百度网盘的下载原理这样就明确了,首先第一次采集取出所执行下载操作的参数,第二次采集使用所需的参数发送下载请求,
最后大家动一下手,把两个采集代码整合在一起,考验点是把参数替换到下载请求的所需参数。

您看到此篇文章时的感受是:
Tags: 责任编辑:风之轨迹
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到QQ空间
分享到: 
定点下篇网盘分享主页与百度网盘批量下载.. 上一篇采集函数之提取文本

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

相关栏目

最新文章

图片主题

热门文章

推荐文章

相关文章

广告位