91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何爬取微信公眾號文章

發布時間:2021-11-25 14:27:19 來源:億速云 閱讀:610 作者:iii 欄目:大數據

本篇內容介紹了“Python如何爬取微信公眾號文章”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

為了實現該爬蟲我們需要用到如下工具

  • Chrome瀏覽器

  • Python 3 語法知識

  • Python的Requests庫

此外,這個爬取程序利用的是微信公眾號后臺編輯素材界面。原理是,當我們在插入超鏈接時,微信會調用專門的API(見下圖),以獲取指定公眾號的文章列表。因此,我們還需要有一個公眾號。

Python如何爬取微信公眾號文章

正式開始

我們需要登錄微信公眾號,點擊素材管理,點擊新建圖文消息,然后點擊上方的超鏈接。

Python如何爬取微信公眾號文章

接著,按F12,打開Chrome的開發者工具,選擇Network

此時在之前的超鏈接界面中,點擊「選擇其他公眾號」,輸入你需要爬取的公眾號(例如中國移動)

Python如何爬取微信公眾號文章

此時之前的Network就會刷新出一些鏈接,其中以"appmsg"開頭的便是我們需要分析的內容

我們解析請求的URL

https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=143406284&lang=zh_CN&f=json&ajax=1

它分為三個部分

  • https://mp.weixin.qq.com/cgi-bin/appmsg: 請求的基礎部分

  • ?action=list_ex: 常用于動態網站,實現不同的參數值而生成不同的頁面或者返回不同的結果

  • &begin=0&count=5&fakeid: 用于設置?里的參數,即begin=0, count=5

通過不斷的瀏覽下一頁,我們發現每次只有begin會發生變動,每次增加5,也就是count的值。

接著,我們通過Python來獲取同樣的資源,但直接運行如下代碼是無法獲取資源的

import requests
url = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=1957521839&lang=zh_CN&f=json&ajax=1"
requests.get(url).json() 
# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}

我們之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后端。而Python并沒有我們的登錄信息,所以請求是無效的。我們需要在requests中設置headers參數,在其中傳入Cookie和User-Agent,來模擬登陸

由于每次頭信息內容都會變動,因此我將這些內容放入在單獨的文件中,即"wechat.yaml",信息如下

cookie:  ua_id=wuzWM9FKE14...
user_agent: Mozilla/5.0...

之后只需要讀取即可

# 讀取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
    file_data = file.read()
config = yaml.safe_load(file_data)

headers = {
    "Cookie": config['cookie'],
    "User-Agent": config['user_agent'] 
}

requests.get(url, headers=headers, verify=False).json()

在返回的JSON中,我們就看到了每個文章的標題(title), 摘要(digest), 鏈接(link), 推送時間(update_time)和封面地址(cover)等信息。

appmsgid是每一次推送的唯一標識符,aid則是每篇推文的唯一標識符。

Python如何爬取微信公眾號文章

實際上,除了Cookie外,URL中的token參數也會用來限制爬蟲,因此上述代碼很有可能輸出會是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}

接著我們寫一個循環,獲取所有文章的JSON,并進行保存。

import json
import requests
import time
import random

import yaml
with open("wechat.yaml", "r") as file:
    file_data = file.read()
config = yaml.safe_load(file_data)

headers = {
    "Cookie": config['cookie'],
    "User-Agent": config['user_agent'] 
}

# 請求參數
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
    "action": "list_ex",
    "begin": begin,
    "count": "5",
    "fakeid": config['fakeid'],
    "type": "9",
    "token": config['token'],
    "lang": "zh_CN",
    "f": "json",
    "ajax": "1"
}

# 存放結果
app_msg_list = []
# 在不知道公眾號有多少文章的情況下,使用while語句
# 也方便重新運行時設置頁數
i = 0
while True:
    begin = i * 5
    params["begin"] = str(begin)
    # 隨機暫停幾秒,避免過快的請求導致過快的被查到
    time.sleep(random.randint(1,10))
    resp = requests.get(url, headers=headers, params = params, verify=False)
    # 微信流量控制, 退出
    if resp.json()['base_resp']['ret'] == 200013:
        print("frequencey control, stop at {}".format(str(begin)))
        break
    
    # 如果返回的內容中為空則結束
    if len(resp.json()['app_msg_list']) == 0:
        print("all ariticle parsed")
        break
        
    app_msg_list.append(resp.json())
    # 翻頁
    i += 1

在上面代碼中,我將fakeid和token也存放在了"wechat.yaml"文件中,這是因為fakeid是每個公眾號都特有的標識符,而token則會經常性變動,該信息既可以通過解析URL獲取,也可以從開發者工具中查看

在爬取一段時間后,就會遇到如下的問題

{'base_resp': {'err_msg': 'freq control', 'ret': 200013}}

此時你在公眾號后臺嘗試插入超鏈接時就能遇到如下這個提示

Python如何爬取微信公眾號文章

這是公眾號的流量限制,通常需要等上30-60分鐘才能繼續。為了完美處理這個問題,你可能需要申請多個公眾號,可能需要和微信公眾號的登錄系統斗智斗勇,或許還需要設置代理池。

但是我并不需要一個工業級別的爬蟲,只想爬取自己公眾號的信息,因此等個一小時,重新登錄公眾號,獲取cookie和token,然后運行即可。我可不想用自己的興趣挑戰別人的飯碗。

最后將結果以JSON格式保存。

# 保存結果為JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
    file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))

或者提取文章標識符,標題,URL,發布時間這四列信息,保存成CSV。

info_list = []
for msg in app_msg_list:
    if "app_msg_list">

最終代碼如下(代碼可能有bug,謹慎使用),使用方法為python wechat_parser.py wechat.yaml

import json
import requests
import time
import random
import os
import yaml
import sys

if len(sys.argv) < 2:
    print("too few arguments")
    sys.exit(1)

yaml_file = sys.argv[1]
if not os.path.exists(yaml_file):
    print("yaml_file is not exists")
    sys.exit(1)
    

with open(yaml_file, "r") as file:
    file_data = file.read()
config = yaml.safe_load(file_data)

headers = {
    "Cookie": config['cookie'],
    "User-Agent": config['user_agent'] 
}

# 請求參數
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
    "action": "list_ex",
    "begin": begin,
    "count": "5",
    "fakeid": config['fakeid'],
    "type": "9",
    "token": config['token'],
    "lang": "zh_CN",
    "f": "json",
    "ajax": "1"
}

# 存放結果
if os.path.exists("mp_data.json"):
    with open("mp_data.json", "r") as file:
        app_msg_list = json.load(file)
else:
    app_msg_list = []
# 在不知道公眾號有多少文章的情況下,使用while語句
# 也方便重新運行時設置頁數
i = len(app_msg_list) 
while True:
    begin = i * 5
    params["begin"] = str(begin)
    # 隨機暫停幾秒,避免過快的請求導致過快的被查到
    time.sleep(random.randint(1,10))
    resp = requests.get(url, headers=headers, params = params, verify=False)
    # 微信流量控制, 退出
    if resp.json()['base_resp']['ret'] == 200013:
        print("frequencey control, stop at {}".format(str(begin)))
        break
    
    # 如果返回的內容中為空則結束
    if len(resp.json()['app_msg_list']) == 0:
        print("all ariticle parsed")
        break
        
    app_msg_list.append(resp.json())
    # 翻頁
    i += 1

# 保存結果為JSON
json_name = "mp_data.json"
with open(json_name, "w") as file:
    file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))

“Python如何爬取微信公眾號文章”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瓮安县| 上林县| 从化市| 滦南县| 锦屏县| 中卫市| 锡林郭勒盟| 巴彦县| 和林格尔县| 新巴尔虎右旗| 永丰县| 平原县| 正蓝旗| 牡丹江市| 安吉县| 肥东县| 长宁区| 江门市| 宁城县| 通榆县| 三都| 沾化县| 沙河市| 德阳市| 黔南| 新蔡县| 托里县| 长岭县| 南宁市| 黔西县| 玉龙| 阿拉善左旗| 海丰县| 西和县| 策勒县| 太湖县| 望城县| 罗平县| 禄丰县| 昭平县| 石楼县|