1. 程式人生 > 實用技巧 >Python 微信公眾號文章爬取

Python 微信公眾號文章爬取

此文轉載自:https://blog.csdn.net/qq_36684855/article/details/110226009

Python 微信公眾號文章爬取

一.思路

我們通過網頁版的微信公眾平臺的圖文訊息中的超連結獲取到我們需要的介面

從介面中我們可以得到對應的微信公眾號和對應的所有微信公眾號文章。

二.介面分析

獲取微信公眾號的介面:
https://mp.weixin.qq.com/cgi-bin/searchbiz?
引數:
action=search_biz
begin=0
count=5
query=公眾號名稱
token=每個賬號對應的token值
lang=zh_CN
f=json
ajax=1
請求方式:
GET
所以這個介面中我們只需要得到token即可,而query則是你需要搜尋的公眾號,token則可以通過登入後的網頁連結獲取得到。

獲取對應公眾號的文章的介面:
https://mp.weixin.qq.com/cgi-bin/appmsg?
引數:
action=list_ex
begin=0
count=5
fakeid=MjM5NDAwMTA2MA==
type=9
query=
token=557131216
lang=zh_CN
f=json
ajax=1
請求方式:
GET
在這個介面中我們需要獲取的值有上一步的token以及fakeid,而這個fakeid則在第一個介面中可以獲取得到。從而我們就可以拿到微信公眾號文章的資料了。

三.實現

第一步:

首先我們需要通過selenium模擬登入,然後獲取到cookie和對應的token

def weChat_login(user, password):
    post = {}
    browser = webdriver.Chrome()
    browser.get('https://mp.weixin.qq.com/')
    sleep(3)
    browser.delete_all_cookies()
    sleep(2)
    # 點選切換到賬號密碼輸入
    browser.find_element_by_xpath("//a[@class='login__type__container__select-type']").click()
    sleep(
2) # 模擬使用者點選 input_user = browser.find_element_by_xpath("//input[@name='account']") input_user.send_keys(user) input_password = browser.find_element_by_xpath("//input[@name='password']") input_password.send_keys(password) sleep(2) # 點選登入 browser.find_element_by_xpath("//a[@class='btn_login']").click() sleep(2) # 微信登入驗證 print('請掃描二維碼') sleep(20) # 重新整理當前網頁 browser.get('https://mp.weixin.qq.com/') sleep(5) # 獲取當前網頁連結 url = browser.current_url # 獲取當前cookie cookies = browser.get_cookies() for item in cookies: post[item['name']] = item['value'] # 轉換為字串 cookie_str = json.dumps(post) # 儲存到本地 with open('cookie.txt', 'w+', encoding='utf-8') as f: f.write(cookie_str) print('cookie儲存到本地成功') # 對當前網頁連結進行切片,獲取到token paramList = url.strip().split('?')[1].split('&') # 定義一個字典儲存資料 paramdict = {} for item in paramList: paramdict[item.split('=')[0]] = item.split('=')[1] # 返回token return paramdict['token']

定義了一個登入方法,裡面的引數為登入的賬號和密碼,然後定義了一個字典用來儲存cookie的值。通過模擬使用者輸入對應的賬號密碼並且點選登入,然後會出現一個掃碼驗證,用登入的微信去掃碼即可。
重新整理當前網頁後,獲取當前cookie以及token然後返回。

第二步:

1.請求獲取對應公眾號介面,取到我們需要的fakeid

    url = 'https://mp.weixin.qq.com'
    headers = {
        'HOST': 'mp.weixin.qq.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
    }
    with open('cookie.txt', 'r', encoding='utf-8') as f:
        cookie = f.read()
    cookies = json.loads(cookie)
    resp = requests.get(url=url, headers=headers, cookies=cookies)
    search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
    params = {
        'action': 'search_biz',
        'begin': '0',
        'count': '5',
        'query': '搜尋的公眾號名稱',
        'token': token,
        'lang': 'zh_CN',
        'f': 'json',
        'ajax': '1'
    }
    search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)

將我們獲取到的token和cookie傳進來,然後通過requests.get請求,獲得返回的微信公眾號的json資料

lists = search_resp.json().get('list')[0]

通過上面的程式碼即可獲取到對應的公眾號資料

fakeid = lists.get('fakeid')

通過上面的程式碼就可以得到對應的fakeid

2.請求獲取微信公眾號文章介面,取到我們需要的文章資料

    appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
    params_data = {
        'action': 'list_ex',
        'begin': '0',
        'count': '5',
        'fakeid': fakeid,
        'type': '9',
        'query': '',
        'token': token,
        'lang': 'zh_CN',
        'f': 'json',
        'ajax': '1'
    }
    appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)

我們傳入fakeid和token然後還是呼叫requests.get請求介面,獲得返回的json資料。
我們就實現了對微信公眾號文章的爬取。

四.總結

通過對微信公眾號文章的爬取,需要掌握selenium和requests的用法,以及如何獲取到請求介面。但是需要注意的是當我們迴圈獲取文章時,一定要設定延遲時間,不然賬號很容易被封禁,從而得不到返回的資料。