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

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

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

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

  接著(zhù),我們通過(guò)Python來(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ú)效的。我們須要在requests中設置headers參數,在其中傳入Cookie和User-Agent,來(lái)模擬登錄

  由于每次頭信息內容還會(huì )變動(dòng),因此我將這種內容裝入在單獨的文件中,即"wechat.yaml",信息如下

  cookie: ua_id=wuzWM9FKE14...<br />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中,我們就聽(tīng)到了每位文章的標題(title), 摘要(digest), 鏈接(link), 推送時(shí)間(update_time)和封面地址(cover)等信息。

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

  

  實(shí)際上,除了Cookie外,URL中的token參數也會(huì )拿來(lái)限制爬蟲(chóng),因此上述代碼太有可能輸出會(huì )是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}

  接著(zhù)我們寫(xiě)一個(gè)循環(huán),獲取所有文章的JSON,并進(jìn)行保存。

  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

  在里面代碼中,我將fakeid和token也儲存在了"wechat.yaml"文件中,這是因為fakeid是每位公眾號都特有的標識符,而token則會(huì )經(jīng)常性變動(dòng),該信息既可以通過(guò)解析URL獲取,也可以從開(kāi)發(fā)者工具中查看

  

  在爬取一段時(shí)間后,就會(huì )碰到如下的問(wèn)題

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

  此時(shí)你在公眾號后臺嘗試插入超鏈接時(shí)才能遇見(jiàn)如下這個(gè)提示

  

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

  但是我并不需要一個(gè)工業(yè)級別的爬蟲(chóng),只想爬取自己公眾號的信息,因此等個(gè)一小時(shí),重新登陸公眾號,獲取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,發(fā)布時(shí)間這四列信息,保存成CSV。

0 個(gè)評論

要回復文章請先登錄注冊


官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

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