前文中我们通过理论讲解和三个爬虫实例构建了一个比较完整的爬虫知识框架,而这三个实例有一个特点就是都是网页端爬虫,本文借助Fildder软件和Python实现对手机app进行抓包的爬虫程序,使得app的数据也无所遁形!
一、Fiddler介绍
1.Fiddler简介
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。
通俗来讲,Fiddler 的工作原理相当于一个代理,配置好以后,我们从手机 App 发送的请求会由 Fiddler 发送出去,服务器返回的信息也会由 Fiddler 中转一次。所以通过 Fiddler 我们就可以看到 App 发给服务器的请求以及服务器的响应了。
![e3f40208f4de172e272fe814a5d0c94e.png](https://i-blog.csdnimg.cn/blog_migrate/761e63f4a6d068a8d33348065bbc06de.jpeg)
2.FiddlerPC端配置
我们安装好 Fiddler 后,首先在菜单 Tool>Options>Https 下面的这两个地方选上。
![3ff52edfe79eb6bc6a132e58fc43ac73.png](https://i-blog.csdnimg.cn/blog_migrate/e7855f2603fc81dc24810b864b93bad6.jpeg)
然后在 Connections 标签页下面勾选上 Allow remote computers to connect,允许 Fiddler 接受其他设备的请求。
![67752c9fb17cfa2b663c1eb59db8d468.png](https://i-blog.csdnimg.cn/blog_migrate/1a5113e348d4ad32f4fefebfdc4ce7c6.jpeg)
同时要记住这里的端口号,默认是 8888,到时候需要在手机端填。配置完毕,保存后,一定关掉 Fiddler 重新打开。
3.Fiddler手机端配置
首先按win+R键输入cmd打开,输入命令ipconfig查看IP地址:
![89948a3f5a0db81a9a11be6a9d895ed0.png](https://i-blog.csdnimg.cn/blog_migrate/1ef12d242d580688fb81ec33450bd6a3.jpeg)
打开手机无线连接,选择要连接的热点。长按选择修改网络,在代理中填上我们电脑的 IP 地址和 Fiddler 代理的端口。如下图所示:
![15004f237085fb1b48d69f8639658110.png](https://i-blog.csdnimg.cn/blog_migrate/4921f37398ad215a316665ab51501856.jpeg)
![09d00234d7fd71c4005469c37070bcf4.png](https://i-blog.csdnimg.cn/blog_migrate/6aecbb95169d2d9e211314e0e07b93bd.jpeg)
保存后,在手机默认浏览器(即手机自带浏览器)中打开上文查询到的ip地址http://192.168.0.106:8888(视自身情况而定)。
![f82bb57b00cbea14672b68b176511ca6.png](https://i-blog.csdnimg.cn/blog_migrate/a3bf77f06c2ff8d5278869a9f256adb2.jpeg)
之后点击上述蓝色链接并安装到手机就可以进一步的使用电脑代理监控了。
![d047f2951e69a8ebacd86a39b9edb899.png](https://i-blog.csdnimg.cn/blog_migrate/0c8ea96e8c355e1f125b64a5e4dca9a9.jpeg)
二、今日头条app抓包实战
1.源代码获取
首先我们在上述配置环境下打开手机今日头条app,并搜索“疫情”:
![a82a81a8bc1228ced0b7bf179f37dda3.png](https://i-blog.csdnimg.cn/blog_migrate/b1b7a06b1e829ce045739ca8fc645b1c.jpeg)
之后可在Fildder中观察到弹出诸多条目,通过查看和经验筛选发现带有search的url即为我们所求,双击这条URL,可以进一步获取到requests url和client(即我们的客户端请求头)
![36e0deafe1eb567dd88f659d029bedc2.png](https://i-blog.csdnimg.cn/blog_migrate/4df6f5a19c3d305c0e694e0c8ade5912.jpeg)
略微梳理一下就可以得到当前请求的代码:
import requestsimport timefrom bs4 import BeautifulSoupimport pandas as pdimport jsonimport randomfrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(InsecureRequestWarning)head = { 'Accept': '*/*', 'Accept-Encoding': 'gzip,deflate', 'Accept-Language': 'zh-CN,en-US;q=0.8', 'User-Agent': 'Mozilla/5.0 (Linux; Android 7.0; HUAWEI CAZ-AL10 Build/HUAWEICAZ-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Mobile Safari/537.36 JsSdk/2 NewsArticle/7.0.1 NetType/wifi', 'X-Requested-With': 'com.ss.android.article.news'}url = "https://is-lq.snssdk.com/search/?keyword=..."req = requests.get(url=url, headers=head,verify=False).json()
2.json提取
接下来我们的任务就在于分析响应的json文件,通过req.keys()命令获取键信息,注意查找,发现在key为scripts的value中包含文章的所有信息,而值为Javascript代码字符串,因此通过Beautiful库进行解析:
soup = BeautifulSoup(req['scripts'],"lxml")contents = soup.find_all('script',attrs={"type":"application/json"})res = []for content in contents: js = json.loads(content.contents[0]) abstract = js['abstract'] article_url = js['article_url'] comment_count = js['comment_count'] raw_title = js['display']['emphasized']['title'] title = raw_title.replace("","").replace("","") source = js['display']['emphasized']['source'] data = { 'title':title, 'article_url':article_url, 'abstract':abstract, 'comment_count':comment_count, 'source':source } res.append(data)
3.信息存储
在相关文章信息提取完之后即可选择信息存储方式,我们通常采用json、csv、xlsx等格式进行存储:
def write2excel(result): json_result = json.dumps(result) with open('article.json','w') as f: f.write(json_result) with open('article.json','r') as f: data = f.read() data = json.loads(data) df = pd.DataFrame(data,columns=['title','article_url','abstract','comment_count','source']) df.to_excel('article.xlsx',index=False)
4.自动化爬虫构建
最后一步,也就是找到翻页规律,完成自动化爬虫构建。我们在搜索出的结果页依次用手向下滑动,发现继续弹出search的url,观察下图:
![cfc7ac53832e3ee651290f48b7280e8e.png](https://i-blog.csdnimg.cn/blog_migrate/206e54499998b9019ba66e588ffb1d25.jpeg)
观察这些url,发现仅仅在offset这个参数有所区别,而且是10的倍数,因此我们的翻页循环代码为:
def get_pages(keyword,page_n): res_n = [] for page_id in range(page_n): page = get_one_page(keyword = keyword,offset = str(page_id*10)) res_n.extend(page) time.sleep(random.randint(1,10)) return res_n
三、爬虫总结
至此利用Fildder软件结合python程序很容易的构建了手机端app爬虫程序,再通过此爬虫总结一下:首先我们先安装好Fildder软件,并且同时配置好PC端和手机端代理,之后通过在手机上操作反馈到电脑端Fildder查看结果;进而通过Fildder抓包结果判断请求具体参数和数据格式,之后对响应的数据进行进一步的加工和存储就ok了。结果如下:
![f659aec02ad2d65863b56e1c9e9fe032.png](https://i-blog.csdnimg.cn/blog_migrate/956324a09d093da5fcf984191ed00580.jpeg)
爬虫完整代码可以在本头条号私信获得。本文即前文都是在单机背景下进行爬虫,爬虫效率有限且定制化成本较高,下文将进一步对分布式爬虫框架进行讲解和实战,前文涉及的基础知识可参考下面链接:
爬虫所要了解的基础知识,这一篇就够了!Python网络爬虫实战系列
一文带你深入了解并学会Python爬虫库!从此数据不用愁
Python爬虫有多简单?一文带你实战豆瓣电影TOP250数据爬取!
一文弄清Python网络爬虫解析库!内含多个实例讲解
谁说同花顺很难爬?一文带你学会用Python爬取财经动态网页!
谁说京东商品很难爬?一文教你用Python构建电商网站爬虫!