爬虫进阶(三)

时间:2022-05-08
本文章向大家介绍爬虫进阶(三),主要内容包括01|背景介绍:、02|Fiddler是什么:、03|Fiddler的下载与安装:、04|获取目标URL:、05|请求URL:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

总第69篇

01|背景介绍:

我们前面的几篇推文都是针对网页版的内容进行抓取,但是有的时候当我们想要的数据没有网页版只有APP端时,这个时候该怎么办呢?是人工去摘抄我们想要的数据吗?我们肯定不想这么做,我们想想怎样网页版和APP版有什么不同,是什么原因导致我们不能够按以往的方式来正常抓取数据。

要想找到原因,我们需要重温一下网页版爬虫的基本流程,查看一下APP版的爬虫是卡在哪里了,通过对比发现,网页版爬虫的第一步就是获取目标URL,但是APP版就卡在第一步,我们没法获取APP版的URL。

那么我们只要解决了APP版URL的这个问题就可以解决APP版爬取数据的问题了。

接下来寻找能够获取APP版URL的工具,看看有没有前人已经造好这样的轮子,在搜索的过程中发现真有这样神奇的工具,那就是Fiddler这个轮子。

02|Fiddler是什么:

(Fiddler官网图片)

汉译及百度:Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯(通俗一点就是它可以记录你所有访问的网站情况),设置断点,查看所有的“进出”Fiddler的数据包扩:cookie,html,js,css等文件。

03|Fiddler的下载与安装:

这里也不重复造轮子了,也直接采用前人的造好的轮子。

天真无邪CSDN博客:http://blog.csdn.net/jiangwei0910410003/article/details/19806999

04|获取目标URL:

把Fiddler安装好以后,在手机上下载好目标APP,然后就可以开始操作了。这里我们以获取收趣APP中热门板块为例。

当我们打开APP中的该页面时,会出现好多api.shouqu.me,Fiddler会把一个页面分成好多URL,我们的重点是找出我们真正需要的那个URL。

(众多api.shouqu.me)

我的逻辑是先找出Content-Type为application对应的api.shouqu.me,然后依次点击前几个出现的内容。

(带有Content-Type的api)

具体查看哪个URL是目标URL,可以通过下图的界面(Fiddler右侧界面)来获取,该界面由request和response两部分组成。

当选中左侧界面的一个URL时,右侧界面会出现下图一这种显示。点击红色框内的部分就会出现图二的内容,通过将图二中的内容和图三中的内容进行对比发现,该URL就是我们想要的目标 URL。

(图一)

(图二)

(图三)

05|请求URL:

获得目标URL以后我们需要利用request来请求URL,在这里我们需要注意请求方式(post/get),同时也需要设置headers,这两部分内容均可以在Fiddler客户端的右侧界面中的上半部分获取。

找到这些以后开始编写代码了,代码如下:

import requests
headers={    
    "User-Agent":"okhttp/3.6.0",    
    "Content-Type": "application/x-www-form-urlencoded",
}
url="http://api.shouqu.me/api_service/api/v1/daily/dailyMark"
response=requests.post(url,headers=headers)
response.text

运行代码以后出现下面的结果,并没有出现预想的结果。

试了好几次,上网查了很久发现是URL的问题,是因为目标url复制的有问题,详细参考下面的博文:

Fiddler抓包——get请求:http://www.cnblogs.com/yoyoketang/p/6765199.html Fiddler抓包——post请求:http://www.cnblogs.com/yoyoketang/p/6771696.html

经过上面的两篇文章以后我们对URL进行了修改,具体如下:

import requests
headers={   
     "token": "3591fabd529e94af851cc995083257b415c6b9054dc",  
     "Content-Type": "application/x-www-form-urlencoded",   
     "Content-Length": "173",    
     "Host": "api.shouqu.me",   
     "Connection": "Keep-Alive",  
     "Accept-Encoding": "gzip",   
     "User-Agent": "okhttp/3.6.0",
}
url="http://api.shouqu.me/api_service/api/v1/daily/dailyMark/s?osv=5.1&dem=Meizu&imei=868746026657881&userId=10127480&pageSize=20&mac=68%3A3e%3A34%3A26%3A24%3A01&apv=2.0.3.1&lastUpDate=1496455596&pageNo=1&pThemeid=0&os=android&model=MX5"
response=requests.post(url,headers=headers)
response.text

运行代码以后出现了ConnectionError,并没有得到预想的结果。

又经过一段时间的上网查阅以后,发现是因为User-Agent的问题。在上面的代码中我们可以看出User-Agent:”okhttp/3.6.0”,而实际中是“Mozilla/5.0 (Linux; Android 6.0.1; MI 4LTE Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) ”这种的。我们需要把前面这种切换成后面这种。切换到后面这种形式以后就可以正常request了,具体转化参考博文:

http://www.open-open.com/lib/view/open1480922472121.html

一般情况下,显示的User-Agent都是正常的不需要进行转化,特别APP(比如收趣)需要,下面列举一个不需要进行转化的,以知乎APP为例。

import requests
headers={   
     "Authorization": "Bearer 2.0ABBM1DS23QgAUIJWoZwSCwwAAABgAlVN6C5HWQDE7mp84KUOjpcKU2mlsS8vSN75mg",    "User-Agent": "Futureve/4.52.1 Mozilla/5.0 (Linux; Android 5.1; MX5 Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.146 Mobile Safari/537.36 Google-HTTP-Java-Client/1.22.0 (gzip)",   
     "Cookie": "acw_tc=AQAAAAzKO0a/WAYA07x4q1ddrDhjA2Ck; aliyungf_tc=AQAAAPDogxwrKAYA07x4qwvl2q8qsrho"}
url="https://api.zhihu.com/topstory?action=pull&before_id=29&limit=10&action_feed=True&session_token=27f6e12ef281be55176934dcaf29bba0"
response=requests.get(url,headers=headers)
response.text

通过上面的代码对知乎APP进行数据获取,我们可以得到下图这样的结果,很明显这是得到正确的的响应。

接下来就是利用BS库进行解析获取里面的内容即可,与以往的爬虫一致,由于版面过长就不进行赘述了。

你还可以看以下文章:

爬虫进阶(一)

爬虫进阶(二)