1 在电脑上登录微信
2 打开fiddler抓包软件,然后打开电脑版微信,找到需要爬取的公众号,
3 点击公众号,再点击查看历史信息
4进入历史信息界面如下
5 向下滑动右侧的滚动条,同时观察fiddler上的抓包信息,这里为了便于分析 ,可以添加过滤规则 在Fiddler的filter添加过滤规则 mp.weixin.qq.com/mp/profile_ext?action=getmsg
有新的抓包信息出现后即可停止,仔细分析抓包软件中显示的信息新的抓包信息的请求就是拖动滚动条,后台向微信服务器发起的请求,该请求可以返回公众号发布过的历史文章信息。
6 分析HTTP请求参数
多滑动几次滚动条,分析每次请求的参数,发现以上参数中只有offset和is_ok参数会变化,这两个参数是如何构造的呢,分析这类请求返回的json数据
在返回的json数据中,next_offset对应的就是下一次请求对应的offset参数,can_msg_continue对应的就是下一次请求对应的is_ok参数,通过观察,当返回
json数据can_msg_continue=0的时候就代表历史信息翻页已经翻到底了。
继续分析json数据, 可以看到general_msg_list键对应的value里包含了文章列表的基本信息,比如文章标题和url,向url发起请求便可以拿到文章内容。
公众号文章的接口地址 /mp/profile_ext?
action=getmsg&__biz=MjM5ODIzNDEx&f=json&offset=25&count=10&is_ok=1&scene=124&uin=MTU0MTQzNj&key=f57423 ,参数比较多,
其中有用的
参数 __biz 是用户和公众号之间的唯一id,
uin是用户的id,这个是不变的,
key 是请求的秘钥,一段时间就会失效,
offset 是偏移量,
count 是每次请求的条数,
返回值可以看到返回数据包括文章标题titile、摘要digest、文章地址content_url、阅读原文地址source_url、封面cover、作者author 等
抓取所以文章的列表
### 完整代码
# 导入相关数据包
import json
import time
import requests
wx_url = r"https://mp.weixin.qq.com/mp/profile_ext"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63040026)"
}
url_list = {}
def parse_weixin(biz,index,key):
# 构建 url 请求参数 __biz uin key pass_ticket appmsg_token
offset = (index+1)*10
params = {
"action":"getmsg",
"__biz":biz,
"f":"json",
"offset":str(offset),
"count":"10",
"is_ok":"1",
"scene":"124",
"uin":"NjU1NjAzMTE0",
"key":key,
"pass_ticket":"C+a973uxAppkGDNicNtAauknNabSPPvNqh1E5Ubt3m7i0v4lZc31uEPMHRvCGsbw",
"wxtoken":"",
"appmsg_token":"1137_om8ZctvGWpEzIAHDlbJeqf7keaVh23m2uCAxFg~~",
"x5":"0" ,
"f":"json",
}
res_data = requests.get(wx_url,headers=headers,params=params)
#print(res_data.text)
data = json.loads(res_data.text)
#print(data)
mgs_data = json.loads(data['general_msg_list'])
#print(mgs_data)
for msg in mgs_data.get('list',[]):
url,title = msg['app_msg_ext_info']['content_url'], msg['app_msg_ext_info']['title']
print(title,url)
url_list[title] = url
print("-----------------------------")
next_offset = data['next_offset']
can_msg_continue = data['can_msg_continue']
# 判断是否还可以继续翻页
if can_msg_continue:
time.sleep(1)
index += 1
parse_weixin(biz,index,key)
else:
print("爬取完毕")
# 函数调用
biz = "MzU1Njg3NDU4Nw=="
index = 0
key = "19106811931cc753a308bd3b9fd94318b93b0a19fb15e5ee010ce7bc50a22caaf250a090f27f83ec985123caa043e84506b0356dc0e6601e9d4b0cb6df45814bbfaf5bf64d04b80e3fcee195546ea1036df46463f4d57c555fa0abfc211bbaa60827e5159304214c24ab2a5ca8b92a620b1e8ecfdc608e6df9ac904cc52d2130"
res_data = parse_weixin(biz,index,key)
抓取某一文章内容
import requests
from lxml import etree
url = "http://mp.weixin.qq.com/s?__biz=MzU1Njg3NDU4Nw==&mid=2247499340&idx=1&sn=7c479056b2064e9435ed935d0345a733&chksm=fc3cd078cb4b596e464301c39657ddc3136b684ace60c483a7946257f0a85e2379fd51150cd9&scene=27#wechat_redirect"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63040026)"
}
response_content = requests.get(url,headers=headers)
response_content.encoding = "utf-8"
datas = response_content.text
data_xpath = etree.HTML(datas)
results = data_xpath.xpath('//*[@id="js_content"]/section/section/section/section/section[2]/section/section/p/span/text()')
for result in results:
print(result)