一、前期准备工作:
1、下载【Fiddler 4】抓包工具,下载地址:https://pan.baidu.com/s/1PGAmtPlkA_bCR2RemwTx-A
2、Fiddler软件抓HTTPS包设置见如下链接:
https://www.cnblogs.com/greattao/p/10559348.html
3、代码我放在百度云盘中方便大家下载:
https://pan.baidu.com/s/1QgwPGm24GjHAZFdw8rmIUw
4、指定 微信公众号 url
2.png
5、获取文章列表URL地址:
a、在完成上方步骤的情况下,打开【Fiddler 4】 软件,再做如下操作。
b、在windows10电脑上登陆微信号,点击订阅号》点击待爬取公众号》点击右上角【. . .】三个点的位置》点击查看历史消息》如下图:
1.png
6、访问到历史信息后在Fiddler 中获取 Cookies 和 WebForms:
3.png
二、下载历史信息列表代码部分:
1、下方是整理出来的cookies、data请求体、headers
cookies = {
'pgv_pvid': '2327001205',
'pgv_pvi': '4183395328',
'RK': 'Cdhsxy04GQ',
'ptcz': '7ce27c6a88333747811b3e7bb43a66cc94c2edf15a2e29e33f7f274391a16013',
'o_cookie': '137751895',
'pac_uid': '1_137751895',
'wxuin':'2073067908',
'lang': 'zh_CN',
'wap_sid2':'CISDwtwHElxpQjB3QVJNdjFlbnR0NjZzN1ZoLXhnQnZ6TnJSaHp6bG9TZ2xZTW5US0lmUGFzLXZXcFZ5RGNYVVNPbHdYT3VERW0xTjYzR0tka0xDUGxpOHZKNVd5d29FQUFBfjDn747uBTgNQJVO',
'devicetype': 'iPhoneiOS13.1.3',
'version': '17000829',
'pass_ticket': 'xBGhFflDvcd8zGLJ3Uo9nhbBZoRLIY8ywBCd/C/BCsh5XSVJubXMTIP6DYM5qZ6'
}
data = {
'action': 'getmsg',
'__biz': 'MzUyNzg1OTE1OA==',
'f': 'json',
'offset': '10',
'count': '10',
'is_ok': '1',
'scene': '123',
'uin': 'MjA3MzA2NzkwOA==',
'key': '6adc7da9052a21f148e133f92eb7d1dbf47f35ec1b4dffee8c1ae5d8e6eeeb04320ccb68e95aba03109a263a456eb5e7c4e5e75592ee7f4e5bd8b2f3a27aec89e21513c8abf716134f300d81f0400138',
'pass_ticket': 'xBGhFflDvcd8zGLJ3Uo9+nhbBZoRLIY8ywBCd/C/BCsh5XSVJubXMTIP6DYM5qZ6',
'appmsg_token': '1034_lyX1UcAhl7CdCliGmOHwHG9KQhZkQmJR4WoI_A~~',
'x5': '0'
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/3.53.1159.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat"
}
2、首先访问历史信息页获取所有文章列表的信息,通过pandas保存到本地csv文件中。
def start(self):
api = 'https://mp.weixin.qq.com/mp/profile_ext?'
WenZhangList = []
for next_offset in range(0,2000,10):
self.data['offset'] = str(next_offset)
html2 = requests.post(api,headers=self.headers,cookies=self.cookies,data=self.data,verify=False)
datadict = json.loads(html2.text)
general_msg_list = json.loads(datadict['general_msg_list'].replace('\\',''))['list']
general_msg_list = [msg['app_msg_ext_info'] for msg in general_msg_list]
WenZhangList.extend(general_msg_list)
print(len(WenZhangList))
time.sleep(2)
GenralDf = pd.DataFrame(WenZhangList)
GenralDf.to_csv('wenzhang.csv')
三、详情页
1、点击访问一篇详情页,重复【一、前期准备工作】中的第5步,获取cookies、data请求体、headers
2、读取csv文件获取详情页的 url 地址 携带上方 步骤1 中的cookies、data请求详情页,代码如下:
def Article(self):
ticledf = pd.read_csv('wenzhang.csv',index_col=0)
ticledf = ticledf[['content_url','title']]
for index, row in ticledf.iterrows():
title = row['title']
url = row["content_url"]
html2 = requests.get(url, headers=header2, cookies=cookie2, data=data2,verify=False)
name = f'{index}_{title}'
print(title)
print(url)
self.BaoCun(html2,name)
time.sleep(3)
def BaoCun(self,html2,name):
f = open(f"./data/{name}.html", "w", encoding="utf-8")
for i in html2.text:
f.write(i)
f.close()
这样所有历史文章的页面就全部爬取结束,并保存到本地静态文件中,后期的解析可以再读取后用xpath解析。我这个项目是讲公众号中的所有文字部分提取出来保存到csv文件钟。
四、解析html文件文字部分保存到csv文件中。
current_dirname = os.path.dirname(__file__)
filePath = f'{current_dirname}/data/'
filename = [i for i in os.listdir(filePath) if 'html' in i]
pdlist = []
for file in filename:
dict1 = {}
Path = f'{current_dirname}/data/{file}'
with open(Path, encoding="utf-8") as f:
html = f.read()
page_source = etree.HTML(html.encode('utf-8'))
lilist = page_source.xpath('//body/div//text()')
str2 = 'varfirst_sceen__time=(+newDate());if(""==1&&document.getElementById(\'js_content\')){document.getElementById(\'js_content\').addEventListener("selectstart",function(e){e.preventDefault();});}(function(){if(navigator.userAgent.indexOf("WindowsWechat")!=-1){varlink=document.createElement(\'link\');varhead=document.getElementsByTagName(\'head\')[0];link.rel=\'stylesheet\';link.type=\'text/css\';link.href="//res.wx.qq.com/mmbizwap/zh_CN/htmledition/style/page/appmsg_new/winwx492bcc.css";head.appendChild(link);}})();'
lilist = [t.replace('\n','').replace(' ','').replace('\t','').replace('\xa0','').replace(str2,'') for t in lilist]
lilist = [i for i in lilist if i]
str1 = '\n'.join(lilist)
dict1['file'] = file
dict1['str1'] = str1
pdlist.append(copy.deepcopy(dict1))
df = pd.DataFrame(pdlist)
df.to_csv('XiangQingYe2.csv')
五、心得体会。
其实微信公众号爬虫难点在于如何从手机端转移到电脑端获取URL地址,在待爬取的公众号不多的情况下可采用我【第一步前期准备工作】获取url,当量大的时候就要采用夜神模拟器安装微信客户端,用python在夜神模拟器上操作微信获取到URL与【第4步:获取文章列表URL地址】相同,后面的其他所有操作就可以全部按照我的代码方式来写。
微信公众号的历史信息页和详情页格式都是固定不变,只要会爬一个公众号其他格式都是一样。
网友评论