日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python通过手机抓取微信公众号

發(fā)布時(shí)間:2024/1/17 python 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python通过手机抓取微信公众号 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用 Fiddler 抓包分析公眾號(hào)

打開微信隨便選擇一個(gè)公眾號(hào),查看公眾號(hào)的所有歷史文章列表

?

?在 Fiddler 上已經(jīng)能看到有請(qǐng)求進(jìn)來了,說明公眾號(hào)的文章走的都是HTTPS協(xié)議,這些請(qǐng)求就是微信客戶端向微信服務(wù)器發(fā)送的HTTP請(qǐng)求。

模擬微信請(qǐng)求?

1、服務(wù)器的響應(yīng)結(jié)果,200 表示服務(wù)器對(duì)該請(qǐng)求響應(yīng)成功
2、請(qǐng)求協(xié)議,微信的請(qǐng)求協(xié)議都是基 于HTTPS 的,所以Fiddle一定要配置好,不然你看不到 HTTPS 的請(qǐng)求。
3、請(qǐng)求路徑,包括了請(qǐng)求方法(GET),請(qǐng)求協(xié)議(HTTP/1.1),請(qǐng)求路徑(/mp/profile_ext...后面還有很長(zhǎng)一串參數(shù))

4、包括Cookie信息在內(nèi)的請(qǐng)求頭。

5、微信服務(wù)器返回的響應(yīng)數(shù)據(jù)。

?

確定微信公眾號(hào)的請(qǐng)求HOST是?mp.weixin.qq.com?之后,我們可以使用過濾器來過濾掉不相關(guān)的請(qǐng)求。

爬蟲的基本原理就是模擬瀏覽器發(fā)送 HTTP 請(qǐng)求,然后從服務(wù)器得到響應(yīng)結(jié)果,現(xiàn)在我們就用 Python 實(shí)現(xiàn)如何發(fā)送一個(gè) HTTP 請(qǐng)求。這里我們使用 requests 庫來發(fā)送請(qǐng)求。

拷貝URL和請(qǐng)求頭

  • 1:找到完整URL請(qǐng)求地址
  • 2:找到完整的請(qǐng)求頭(headers)信息,Headers里面包括了cookie、User-agent、Host 等信息。

我們直接從 Fiddler 請(qǐng)求中拷貝 URL 和 Headers,?右鍵 -> Copy -> Just Url/Headers Only

?

url = 'https://mp.weixin.qq.com/mp/profile_ext' \'?action=home' \'&__biz=MzA5MTAxMjEyMQ==' \'&scene=126' \'&bizpsid=0' \'&devicetype=android-23' \'&version=2607033c' \'&lang=zh_CN' \'&nettype=WIFI' \'&a8scene=3' \'&pass_ticket=LvcLsR1hhcMXdxkZjCN49DcQiOsCdoeZdyaQP3m5rwXkXVN7Os2r9sekOOQULUpL' \'&wx_header=1'

  

因?yàn)?requests.get 方法里面的 headers 參數(shù)必須是字典對(duì)象,所以,先要寫個(gè)函數(shù)把剛剛拷貝的字符串轉(zhuǎn)換成字典對(duì)象。

def headers_to_dict(headers):"""將字符串'''Host: mp.weixin.qq.comConnection: keep-aliveCache-Control: max-age='''轉(zhuǎn)換成字典對(duì)象{"Host": "mp.weixin.qq.com","Connection": "keep-alive","Cache-Control":"max-age="}:param headers: str:return: dict"""headers = headers.split("\n")d_headers = dict()for h in headers:if h:k, v = h.split(":", 1)d_headers[k] = v.strip()return d_headers

公眾號(hào)歷史文章數(shù)據(jù)就在 response.text 中。如果返回的內(nèi)容非常短,而且title標(biāo)簽是<title>驗(yàn)證</title>,

那么說明你的請(qǐng)求參數(shù)或者請(qǐng)求頭有誤,最有可能的一種請(qǐng)求就是 Headers 里面的 Cookie 字段過期,

從手機(jī)微信端重新發(fā)起一次請(qǐng)求獲取最新的請(qǐng)求參數(shù)和請(qǐng)求頭試試

response = requests.get(url, headers=headers_to_dict(headers), verify=False)print(response.text)if '<title>驗(yàn)證</title>' in response.text:raise Exception("獲取微信公眾號(hào)文章失敗,可能是因?yàn)槟愕恼?qǐng)求參數(shù)有誤,請(qǐng)重新獲取") # with open("weixin_history.html", "w", encoding="utf-8") as f: # f.write(response.text)

歷史文章封裝在叫 msgList 的數(shù)組中(實(shí)際上該數(shù)組包裝在字典結(jié)構(gòu)中),這是一個(gè) Json 格式的數(shù)據(jù),但是里面還有 html 轉(zhuǎn)義字符需要處理

?

寫一個(gè)方法提取出歷史文章數(shù)據(jù),分三個(gè)步驟,首先用正則提取數(shù)據(jù)內(nèi)容,然后 html 轉(zhuǎn)義處理,最終得到一個(gè)列表對(duì)象,返回最近發(fā)布的10篇文章

def extract_data(html_content):"""從html頁面中提取歷史文章數(shù)據(jù):param html_content 頁面源代碼:return: 歷史文章列表"""import reimport htmlimport jsonrex = "msgList = '({.*?})'" # 正則表達(dá)pattern = re.compile(pattern=rex, flags=re.S)match = pattern.search(html_content)if match:data = match.group(1)data = html.unescape(data) # 處理轉(zhuǎn)義# print('data: {}'.format(data))data = json.loads(data)articles = data.get("list")for item in articles: print(item)return articles

?

最終提取出來的數(shù)據(jù)總共有10條,就是最近發(fā)表的10條數(shù)據(jù),我們看看每條數(shù)據(jù)返回有哪些字段。

?

發(fā)送時(shí)間對(duì)應(yīng)comm_msg_info.datetime,app_msg_ext_info中的字段信息就是第一篇文章的字段信息,分別對(duì)應(yīng):

  • title:文章標(biāo)題
  • content_url:文章鏈接
  • source_url:原文鏈接,有可能為空
  • digest:摘要
  • cover:封面圖
  • datetime:推送時(shí)間

后面幾篇文章以列表的形式保存在?multi_app_msg_item_list?字段中。

?

?

?詳細(xì)代碼

import requestsurl = 'https://mp.weixin.qq.com/mp/profile_ext' \'?action=home' \'&__biz=MzA5MTAxMjEyMQ==' \'&scene=126' \'&bizpsid=0' \'&devicetype=android-23' \'&version=2607033c' \'&lang=zh_CN' \'&nettype=WIFI' \'&a8scene=3' \'&pass_ticket=LvcLsR1hhcMXdxkZjCN49DcQiOsCdoeZdyaQP3m5rwXkXVN7Os2r9sekOOQULUpL' \'&wx_header=1'headers =''' Host: mp.weixin.qq.comConnection: keep-aliveUser-Agent: Mozilla/5.0 (Linux; Android 6.0.1; OPPO R9s Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044405 Mobile Safari/537.36 MMWEBID/5576 MicroMessenger/6.7.3.1360(0x2607033C) NetType/WIFI Language/zh_CN Process/toolsmpx-wechat-key: d2bc6fe213fd0db717e11807caca969ba1d7537e57fc89f64500a774dba05a4f1a83ae58a3d039efc6403b3fa70ebafb52cfd737b350b58d0dca366b5daf92027aaefcb094932df5a18c8764e98703dcx-wechat-uin: MTA1MzA1Nzk4Mw%3D%3DAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,image/wxpic,image/sharpp,image/apng,image/tpg,/;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,en-US;q=0.8Q-UA2: QV=3&PL=ADR&PR=WX&PP=com.tencent.mm&PPVN=6.7.3&TBSVC=43620&CO=BK&COVC=044405&PB=GE&VE=GA&DE=PHONE&CHID=0&LCID=9422&MO= OPPOR9s &RL=1080*1920&OS=6.0.1&API=23Q-GUID: edb298c301f35e6c59298f2313b788cbQ-Auth: 31045b957cf33acf31e40be2f3e71c5217597676a9729f1b '''def headers_to_dict(headers):"""將字符串'''Host: mp.weixin.qq.comConnection: keep-aliveCache-Control: max-age='''轉(zhuǎn)換成字典對(duì)象{"Host": "mp.weixin.qq.com","Connection": "keep-alive","Cache-Control":"max-age="}:param headers: str:return: dict"""headers = headers.split("\n")d_headers = dict()for h in headers:if h:k, v = h.split(":", 1)d_headers[k] = v.strip()return d_headers# with open("weixin_history.html", "w", encoding="utf-8") as f: # f.write(response.text)def extract_data(html_content):"""從html頁面中提取歷史文章數(shù)據(jù):param html_content 頁面源代碼:return: 歷史文章列表"""import reimport htmlimport jsonrex = "msgList = '({.*?})'" # 正則表達(dá)pattern = re.compile(pattern=rex, flags=re.S)match = pattern.search(html_content)if match:data = match.group(1)data = html.unescape(data) # 處理轉(zhuǎn)義# print('data: {}'.format(data))data = json.loads(data)articles = data.get("list")return articlesdef crawl():"""爬取文章:return:"""response = requests.get(url, headers=headers_to_dict(headers), verify=False)print(response.text)if '<title>驗(yàn)證</title>' in response.text:raise Exception("獲取微信公眾號(hào)文章失敗,可能是因?yàn)槟愕恼?qǐng)求參數(shù)有誤,請(qǐng)重新獲取")data = extract_data(response.text)for item in data:print(item['app_msg_ext_info'])if __name__ == '__main__':crawl()

?

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/xiao-apple36/p/10146824.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的python通过手机抓取微信公众号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。