如何使用python3抓取微信公衆號文章,瞭解一下?

通過微信公衆平臺的查找文章接口,抓取我們需要的相關文章

1.首先我們先看一下,通過正常的登錄自己的微信公衆號,然後用文章搜索功能,搜索一下我們需要查找的相關文章。
  • 打開https://mp.weixin.qq.com
  • 登錄公衆號,打開素材管理,點擊新建分享圖文
    如何使用python3抓取微信公衆號文章,瞭解一下?
  • 打開一個文章搜索接口
    如何使用python3抓取微信公衆號文章,瞭解一下?
  • 輸入要搜索的內容後,可以搜索到相關文章的標題、出自哪個公衆號等信息。

2.實現思路

  • 這裏有一個問題,打開微信公衆平臺首頁,輸入賬號密碼後需要使用管理的微信號掃碼確認一下才能最終成功登錄微信公衆號,這個要怎麼解決呢?

  • 我們可以第一次登錄的時候按正常的流程輸入賬號密碼,掃碼登錄,拿到cookies,保存下來以便後面調用這個cookies來驗證登錄;當然cookies是有失效時間的,但是我在測試的時候好像過了3-4個小時還能用,夠做好多事情了。

  • 基本思路:1.通過selenium驅動瀏覽器 打開登錄頁面 ,輸入賬號密碼登錄 ,獲取登錄後的cookies,保存cookies以便調用;2.拿到cookies之後 ,去請求首頁 登錄後直接跳轉到個人首頁,打開文章搜索框,找一些需要的信息;3.拿到有用的信息後,構造data數據包 ,模擬post請求, 然後返回數據,拿到數據之後 ,解析出我們需要的數據。

3.獲取cookies,話不多說,貼個代碼

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
from selenium import webdriver
import time
import json
driver = webdriver.Chrome()    #需要一個谷歌驅動chromedriver.exe,要支持你當前谷歌瀏覽器的版本
driver.get('https://mp.weixin.qq.com/')     #發起get請求打開微信公衆號平臺登錄頁面,然後輸入賬號密碼登錄微信公衆號

driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[1]/div/span/input').clear()    #定位到賬號輸入框,清除裏面的內容
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[1]/div/span/input').send_keys('這裏輸入你的賬號')   #定位到賬號輸入框,輸入賬號
time.sleep(3)     #等待3秒後執行下一步操作,避免因爲網絡延遲,瀏覽器來不及加載出輸入框,從而導致以下的操作失敗
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[2]/div/span/input').clear()   #定位到密碼輸入框,清除裏面的內容
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[2]/div/span/input').send_keys('這裏輸入你的密碼')   #定位到密碼輸入框,輸入密碼
time.sleep(3)     #原因和以上相同
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[3]/label').click()   #點擊記住密碼
time.sleep(3)     #原因和以上相同
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[4]/a').click()   #點擊登錄

time.sleep(15)    #15秒內掃碼登錄
cookies = driver.get_cookies()  #獲取掃碼登錄成功之後的cookies
print(cookies)       #打印出來看看,如果超時了還不掃碼,獲取到的cookies是不完整的,不能用來登錄公衆號,所以第一次必須掃碼登錄以獲取完整的cookies
cookie = {}      #定義一個空字典,以便把獲取的cookies以字典的形式寫入

for items in cookies:             #把登錄成功後獲取的cookies提取name和value參數寫入空字典cookie
    cookie[items.get('name')] = items.get('value')

with open('cookies.txt','w') as file:          #新建並打開一個cookies.txt文件
    file.write(json.dumps(cookie))  #寫入轉成字符串的字典

driver.close()      #關閉瀏覽器

4.新建一個py文件,代碼如下

#!/usr/bin/env python
# _*_ coding: utf-8 _*_
import requests
import json
import re       #正則模塊
import random   #隨機數模塊
import time

#query = 'python'
#讀取之前登錄後保存的cookies
with open('cookies.txt','r') as file:
    cookie = file.read()

url = 'https://mp.weixin.qq.com/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
    'Referer': 'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&share=1&token=773059916&lang=zh_CN',
    'Host': 'mp.weixin.qq.com',
}

cookies = json.loads(cookie)    #加載之前獲取的cookies
print(cookies)     #可以打印看看,和之前保存的cookies是一樣的

response = requests.get(url, cookies = cookies)    #請求https://mp.weixin.qq.com/,傳cookies參數,登錄成功
token = re.findall(r'token=(\d+)',str(response.url))[0]    #登錄成功後,這是的url裏是包含token的,要把token參數拿出來,方便後面構造data數據包發起post請求
#print(token)
#random.random()返回0到1之間隨機數
#構造data數據包發起post請求
data = {
    'token': token,
    'lang': 'zh_CN',
    'f': 'json',
    'ajax': '1',
    'random': random.random(),
    'url': 'python',
    'begin': '0',
    'count': '3',
}

search_url = 'https://mp.weixin.qq.com/cgi-bin/operate_appmsg?sub=check_appmsg_copyright_stat'      #按F12在瀏覽器裏找post請求的url(搜索文章請求的url)
search_response = requests.post(search_url, cookies=cookies, data=data, headers=headers)     #發起post請求,傳cookies、data、headers參數
max_num = search_response.json().get('total')   #獲取所有文章的條數
num = int(int(max_num/3)) #每頁顯示3篇文章,要翻total/3頁,不過實際上我搜索了幾個關鍵詞,發現微信公衆號文章搜索的接口最多顯示667頁,其實後面還有頁數,max_num/3的結果大於667沒關係

if __name__ == '__main__':
    query = input('請輸入你要搜索的內容:')
begin = 0
while num +1 > 0:
    print(begin)
    data = {
        'token': token,
        'lang': 'zh_CN',
        'f': 'json',
        'ajax': '1',
        'random': random.random(),
        'url': query,
        'begin': '{}'.format(str(begin)),
        'count': '3',
    }

    search_response = requests.post(search_url, cookies=cookies, data=data, headers=headers)

    contentt = search_response.json().get('list')               #list裏面是我們需要的內容,所以要獲取list

    for items in contentt:                                       #具體需要list裏面的哪些參數可以自己選擇,這裏只獲取title、url、nickname、author
        f = open('search.txt',mode='a',)                             #打開一個txt文檔,把獲取的內容寫進去,mode='a'是追加的方式寫入,不覆蓋
        print('文章標題:',items.get('title'))  #獲取文章標題
        f.write('文章標題:')
        f.write(items.get('title'))
        f.write("\n")
        f.write('文章url:')
        f.write(items.get('url'))
        f.write("\n")
        f.write('公衆號:')
        f.write(items.get('nickname'))
        f.write("\n")
        f.write('作者:')
        f.write(items.get('author'))
        f.write("\n")
        f.write("\n")
        print('文章url:',items.get('url'))    #獲取文章的url
        print('公衆號:',items.get('nickname'))  #獲取出自哪個微信公衆號
        print('文章作者:',items.get('author'))   #獲取文章作者

    num -= 1
    begin = int(begin)
    begin += 3
    time.sleep(3)
  • 運行結果如下:

如何使用python3抓取微信公衆號文章,瞭解一下?
如何使用python3抓取微信公衆號文章,瞭解一下?

  • search.txt裏保存的內容如下:

如何使用python3抓取微信公衆號文章,瞭解一下?

  • 只要有一個微信公衆號就可以實現,可以註冊一個試一試。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章