亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

分享文章:Python爬蟲(chóng)實(shí)戰練習:爬取微信公眾號文章

優(yōu)采云 發(fā)布時(shí)間: 2020-12-30 12:08

  分享文章:Python爬蟲(chóng)實(shí)戰練習:爬取微信公眾號文章

  為了實(shí)現此采集器,我們需要使用以下工具

  此外,此采集器使用微信官方帳戶(hù)后臺編輯界面。原理是,當我們插入超鏈接時(shí),微信將調用特殊的API(請參見(jiàn)下圖)以獲取指定官方帳戶(hù)的文章列表。因此,我們還需要擁有一個(gè)官方帳戶(hù)。

  

  PS:如果您需要Python學(xué)習資料,可以加入下面的小組,找到免費的管理員來(lái)獲取

  

  您可以免費獲取源代碼,投影實(shí)戰視頻,PDF文件等

  

  正式開(kāi)始

  我們需要登錄到WeChat官方帳戶(hù),依次單擊“物料管理”,“新建圖形消息”,然后單擊上方的超鏈接。

  

  下一步,按F12鍵打開(kāi)Chrome的開(kāi)發(fā)人員工具,然后選擇“網(wǎng)絡(luò )”

  

  這時(shí),在上一個(gè)超鏈接界面中,單擊“選擇另一個(gè)官方帳戶(hù)”,然后輸入您需要抓取的官方帳戶(hù)(例如中國移動(dòng))

  

  這時(shí),以前的網(wǎng)絡(luò )將刷新一些鏈接,其中以“ appmsg”開(kāi)頭的內容是我們需要分析的

  

  我們解析請求的網(wǎng)址

  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

  分為三個(gè)部分

  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次都只會(huì )開(kāi)始更改,并且每次增加5(即count的值)。

  接下來(lái),我們使用Python獲取相同的資源,但是不可能通過(guò)直接運行以下代碼來(lái)獲取資源

  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沒(méi)有我們的登錄信息,因此該請求無(wú)效。我們需要在請求中設置headers參數,并傳入Cookie和User-Agent以模擬登錄

  因為標題信息的內容每次都會(huì )改變,所以我將這些內容放在一個(gè)單獨的文件“ 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中,我們可以看到每個(gè)文章的標題(標題),摘要(摘要),鏈接(鏈接),推送時(shí)間(update_time)和封面地址(封面)。

  appmsgid是每個(gè)推文的唯一標識符,而aid是每個(gè)推文的唯一標識符。

  

  實(shí)際上,除了cookie之外,URL中的token參數還將用于限制采集器,因此上述代碼很可能輸出{'base_resp':{'ret':200040,'err_msg':'無(wú)效的csrf令牌'}}

  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)以獲取所有文章 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語(yǔ)句

# 也方便重新運行時(shí)設置頁(yè)數

i = 0

while True:

begin = i * 5

params["begin"] = str(begin)

# 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到

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())

# 翻頁(yè)

i += 1

  在上面的代碼中,我還將偽造品和令牌存儲在“ wechat.yaml”文件中。這是因為fakeid是每個(gè)正式帳戶(hù)唯一的標識符,并且令牌會(huì )經(jīng)常更改。此信息可以通過(guò)解析URL獲得,也可以從開(kāi)發(fā)人員工具中查看

  

  爬行一段時(shí)間后,您會(huì )遇到以下問(wèn)題

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

  這時(shí),當您嘗試在官方帳戶(hù)的背景中插入超鏈接時(shí),會(huì )出現以下提示

  

  這是官方帳戶(hù)的流量限制,通常需要等待30-60分鐘才能繼續。為了完美地解決此問(wèn)題,您可能需要申請多個(gè)官方帳戶(hù),可能需要與微信官方帳戶(hù)登錄系統進(jìn)行對抗,或者可能需要建立代理池。

  但是我不需要工業(yè)級的采集器,我只想搜尋我自己的官方帳戶(hù)信息,因此請等待一個(gè)小時(shí),再次登錄到官方帳戶(hù),獲取Cookie和令牌并運行它。我不想為自己的利益挑戰別人的工作。

  最后,將結果保存為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和發(fā)布時(shí)間的四列,并將它們保存為CSV。

  info_list = []

for msg in app_msg_list:

if "app_msg_list" in msg:

for item in msg["app_msg_list"]:

info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))

info_list.append(info)

# save as csv

with open("app_msg_list.csv", "w") as file:

file.writelines("\n".join(info_list))

0 個(gè)評論

要回復文章請先登錄注冊


官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久