我之前用Charles来抓取了得到App的音频资料 抓取得到App音频数据,于是又收到有读者要我抓取公众号文章,于是就有了这一篇文章. 不知道爬谁的文章好,想了想找了比较接地气的公众号大V[匿名一下,省得被认为蹭流量],于是在微信上征得他同意后,开始干活了!
抓取的效果图如下:
打开Charles抓包工具,打开微信客户端,我是直接用微信PC版上查看公众号文章的,其实这与手机上的道理是一样的。
找到目标公众号,然后进入历史文章列表,刷新,发现变黄的选项后观察变化,这里需要注意一下我们的请求数据,我们多次发起请求发现请求中,只是url的偏移量发生了变化.于是我们就找出了规律.
下面两张图我们可以看到只是偏移量发生了变化
然后再看Headers中的cookie,这里的cookie一定要注意,每个公众号对应的cookie是不一样的,
总结说明两点:爬取公众号的文章主要就是注意url与cookie的变化,其它都是相似的。另外每个公众号的url与cookie必须匹配,才能获取到文章列表, 下面可以开始写代码了!
小提示:在你正式爬取文章的时候请关掉Charles软件,因为这里占用了一个443端口,导致你抓取文章出错,切记!
import requests
import time
import json
import os
class mp_spider(object):
def request_data(self):
try:
response = requests.get(self.base_url.format(self.offset), headers=self.headers)
print(self.base_url.format(self.offset))
if 200 == response.status_code:
self.parse_data(response.text)
except Exception as e:
print(e)
time.sleep(2)
pass
def parse_data(self, responseData):
all_datas = json.loads(responseData)
if 0== all_datas['ret']:
summy_datas = all_datas['general_msg_list']
datas = json.loads(summy_datas)['list']
for data in datas:
try:
title = data['app_msg_ext_info']['title']
title_child = data['app_msg_ext_info']['digest']
article_url = data['app_msg_ext_info']['content_url']
cover = data['app_msg_ext_info']['cover']
print(title,title_child,article_url,cover)
except Exception as e:
print(e)
continue
print('----------------------------------------')
time.sleep(3)
self.offset = self.offset+10
self.request_data()
else:
print('抓取数据出错!')
if __name__ == '__main__':
d = mp_spider()
d.request_data()
注意:上面代码中的headers与url代码我已经删除了,公众号不让我添加这些东西,没有办法 完整代码见:https://github.com/pythonchannel/spider_project/tree/pythonchannel-dev/mp_spider
当然我这里只是获取公众号文章列表,也没有考虑过多的东西,下一章我进一步优化,获取公众号内容里面的详细东西,持续关注即可!