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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

50行Python代码,教你获取公众号全部文章

發布時間:2024/9/15 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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":?[]
}


部分代碼如下

???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,?"**************")'__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,?"**************")


最后打印的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中


#?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????})
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.com



import?pdfkitpdfkit.from_url('公眾號文章地址',?'out.pdf')
pdfkit.from_url('公眾號文章地址',?'out.pdf')


運行之后成功導出pdf文件。



完整代碼


import?requestsimport?jsonimport?timefrom?pymongo?import?MongoClienturl?=?'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?Falseif?__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}?頁文章.')
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代码,教你获取公众号全部文章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。