50行Python代码,教你获取公众号全部文章
點擊“小詹學Python”,選擇“置頂或者星標”
第一時間收到精彩推送!
小詹說:我們平時閱讀公眾號的文章會遇到一個問題——閱讀歷史文章體驗不好。的確如此,小詹自己也這么認為。所以今天分享的是好朋友 Python3X 的一篇干貨分享,原文如下:
爬取公眾號的方式常見的有兩種:通過搜狗搜索去獲取,缺點是只能獲取最新的十條推送文章。通過微信公眾號的素材管理,獲取公眾號文章。缺點是需要申請自己的公眾號。
今天介紹一種通過抓包PC端微信的方式去獲取公眾號文章的方法。相比其他的方法非常方便。
如上圖,通過抓包工具獲取微信的網絡信息請求,我們發現每次下拉刷新文章的時候都會請求 mp.weixin.qq.com/mp/xxx?(公眾號不讓添加主頁鏈接,xxx表示profile_ext) 這個接口。
經過多次測試分析,用到了以下幾個參數
__biz :?用戶和公眾號之間的唯一id,
uin :用戶的私密id
key :請求的秘鑰,一段時候只會就會失效。
offset :偏移量
count :每次請求的條數
數據如下
{?"ret":?0,?"errmsg":?"ok",?#?請求狀態?"msg_count":?10,??#?信息條數?"can_msg_continue":?1,?#?是否還可以繼續獲取,1代表可以。0代表不可以,也就是最后一頁?"general_msg_list":?"{"list":[]}",?#?公眾號文本信息?"next_offset":?20,???"video_count":?1,?"use_video_tab":?1,?"real_type":?0,?"home_page_list":?[]}"ret":?0,?"errmsg":?"ok",?#?請求狀態
?"msg_count":?10,??#?信息條數
?"can_msg_continue":?1,?#?是否還可以繼續獲取,1代表可以。0代表不可以,也就是最后一頁
?"general_msg_list":?"{"list":[]}",?#?公眾號文本信息
?"next_offset":?20,??
?"video_count":?1,
?"use_video_tab":?1,
?"real_type":?0,
?"home_page_list":?[]
}
部分代碼如下
????????'uin':?uin,
????????'key':?key,
????????'offset':?offset,
????????'count':?count,
????????'action':?'getmsg',
????????'f':?'json'
????}
????headers?=?{
????????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/74.0.3729.131?Safari/537.36'
????}
????response?=?requests.get(url=url,?params=params,?headers=headers)
????resp_json?=?response.json()
????if?resp_json.get('errmsg')?==?'ok':
????????resp_json?=?response.json()
????????#?是否還有分頁數據,?用于判斷return的值
????????can_msg_continue?=?resp_json['can_msg_continue']
????????#?當前分頁文章數
????????msg_count?=?resp_json['msg_count']
????????general_msg_list?=?json.loads(resp_json['general_msg_list'])
????????list?=?general_msg_list.get('list')
????????print(list,?"**************")
最后打印的list就是公眾號的文章信息詳情。包括標題(titile)、摘要(digest)、文章地址(content_url)、閱讀原文地址(source_url)、封面圖(cover)、作者(author)等等...
輸出結果如下:
[{????"comm_msg_info":?{????????"id":?1000000038,????????"type":?49,????????"datetime":?1560474000,????????"fakeid":?"3881067844",????????"status":?2,????????"content":?""????},????"app_msg_ext_info":?{????????"title":?"入門爬蟲,這一篇就夠了!!!",????????"digest":?"入門爬蟲,這一篇就夠了!!!",????????"content":?"",????????"fileid":?0,????????"content_url":?"http:XXXXXX",????????"source_url":?"",????????"cover":?"I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\\/0?wx_fmt=jpeg",????????"subtype":?9,????????"is_multi":?0,????????"multi_app_msg_item_list":?[],????????"author":?"Python3X",????????"copyright_stat":?11,????????"duration":?0,????????"del_flag":?1,????????"item_show_type":?0,????????"audio_fileid":?0,????????"play_url":?"",????????"malicious_title_reason_id":?0,????????"malicious_content_type":?0????}},{...},{...},{...},{...},{...},{...},{...},{...},{...}]"comm_msg_info":?{????????"id":?1000000038,
????????"type":?49,
????????"datetime":?1560474000,
????????"fakeid":?"3881067844",
????????"status":?2,
????????"content":?""
????},
????"app_msg_ext_info":?{
????????"title":?"入門爬蟲,這一篇就夠了!!!",
????????"digest":?"入門爬蟲,這一篇就夠了!!!",
????????"content":?"",
????????"fileid":?0,
????????"content_url":?"http:XXXXXX",
????????"source_url":?"",
????????"cover":?"I5kME6BVXeLibZDUhsiaEYiaX7zOoibxa9sb4stIwrfuqID5ttmiaoVAFyxKF6IjOCyl22vg8n2NPv98ibow\\/0?wx_fmt=jpeg",
????????"subtype":?9,
????????"is_multi":?0,
????????"multi_app_msg_item_list":?[],
????????"author":?"Python3X",
????????"copyright_stat":?11,
????????"duration":?0,
????????"del_flag":?1,
????????"item_show_type":?0,
????????"audio_fileid":?0,
????????"play_url":?"",
????????"malicious_title_reason_id":?0,
????????"malicious_content_type":?0
????}
},{...},{...},{...},{...},{...},{...},{...},{...},{...}]
獲取數據之后,可以保存到數據庫中,也可以將文章保存在PDF中。
1、保存在Mongo中
conn?=?MongoClient('127.0.0.1',?27017)
db?=?conn.wx??#連接wx數據庫,沒有則自動創建
mongo_wx?=?db.article??#使用article集合,沒有則自動創建
for?i?in?list:
????app_msg_ext_info?=?i['app_msg_ext_info']
????#?標題
????title?=?app_msg_ext_info['title']
????#?文章地址
????content_url?=?app_msg_ext_info['content_url']
????#?封面圖
????cover?=?app_msg_ext_info['cover']
????#?發布時間
????datetime?=?i['comm_msg_info']['datetime']
????datetime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime(datetime))
????mongo_wx.insert({
????????'title':?title,
????????'content_url':?content_url,
????????'cover':?cover,
????????'datetime':?datetime
????})
結果如下
2、導入到PDF文件中
Python3中常用的操作PDF的庫有python-pdf和pdfkit。我用了pdfkit這個模塊導出pdf文件。
pdfkit是工具包Wkhtmltopdf的封裝類,因此需要安裝Wkhtmltopdf才能使用。
可以訪問 https://wkhtmltopdf.org/downloads.html 下載和操作系統匹配的工具包。
實現代碼也比較簡單,只需要傳入導入文件的url即可。
安裝pdfkit庫
pip3?install?pdfkit?-i?http://pypi.douban.com/simple?--trusted-host?pypi.douban.compdfkit.from_url('公眾號文章地址',?'out.pdf')
運行之后成功導出pdf文件。
完整代碼
import?json
import?time
from?pymongo?import?MongoClient
url?=?'http://mp.weixin.qq.com/mp/xxx'(公眾號不讓添加主頁鏈接,xxx表示profile_ext)
#?Mongo配置
conn?=?MongoClient('127.0.0.1',?27017)
db?=?conn.wx??#連接wx數據庫,沒有則自動創建
mongo_wx?=?db.article??#使用article集合,沒有則自動創建
def?get_wx_article(biz,?uin,?key,?index=0,?count=10):
????offset?=?(index?+?1)?*?count
????params?=?{
????????'__biz':?biz,
????????'uin':?uin,
????????'key':?key,
????????'offset':?offset,
????????'count':?count,
????????'action':?'getmsg',
????????'f':?'json'
????}
????headers?=?{
????????'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/74.0.3729.131?Safari/537.36'
????}
????response?=?requests.get(url=url,?params=params,?headers=headers)
????resp_json?=?response.json()
????if?resp_json.get('errmsg')?==?'ok':
????????resp_json?=?response.json()
????????#?是否還有分頁數據,?用于判斷return的值
????????can_msg_continue?=?resp_json['can_msg_continue']
????????#?當前分頁文章數
????????msg_count?=?resp_json['msg_count']
????????general_msg_list?=?json.loads(resp_json['general_msg_list'])
????????list?=?general_msg_list.get('list')
????????print(list,?"**************")
????????for?i?in?list:
????????????app_msg_ext_info?=?i['app_msg_ext_info']
????????????#?標題
????????????title?=?app_msg_ext_info['title']
????????????#?文章地址
????????????content_url?=?app_msg_ext_info['content_url']
????????????#?封面圖
????????????cover?=?app_msg_ext_info['cover']
????????????#?發布時間
????????????datetime?=?i['comm_msg_info']['datetime']
????????????datetime?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime(datetime))
????????????mongo_wx.insert({
????????????????'title':?title,
????????????????'content_url':?content_url,
????????????????'cover':?cover,
????????????????'datetime':?datetime
????????????})
????????if?can_msg_continue?==?1:
????????????return?True
????????return?False
????else:
????????print('獲取文章異常...')
????????return?False
if?__name__?==?'__main__':
????biz?=?'Mzg4MTA2Nzg0NA=='
????uin?=?'NDIyMTI5NDM1'
????key?=?'20a680e825f03f1e7f38f326772e54e7dc0fd02ffba17e92730ba3f0a0329c5ed310b0bd55b3c0b1f122e5896c6261df2eaea4036ab5a5d32dbdbcb0a638f5f3605cf1821decf486bb6eb4d92d36c620'
????index?=?0
????while?1:
????????print(f'開始抓取公眾號第{index?+?1}?頁文章.')
????????flag?=?get_wx_article(biz,?uin,?key,?index=index)
????????#?防止和諧,暫停8秒
????????time.sleep(8)
????????index?+=?1
????????if?not?flag:
????????????print('公眾號文章已全部抓取完畢,退出程序.')
????????????break
????????print(f'..........準備抓取公眾號第{index?+?1}?頁文章.')
推薦閱讀(點擊即可跳轉)
互聯網 4 大發明之二維碼,你如何使用 Python 生成二維碼?
總結
以上是生活随笔為你收集整理的50行Python代码,教你获取公众号全部文章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019,GMIS归来!杨强、吴恩达等全
- 下一篇: 住过一晚两万的ICU后,我还是建议你不要