微信公眾號文章檢索方法摘要(第1部分)
優(yōu)采云 發(fā)布時(shí)間: 2020-08-06 18:25
爬蟲(chóng)
我經(jīng)常有一些需要幫助的人,他們在搜尋公共帳戶(hù)文章方面需要幫助. 這次我將總結各種方法.
目前,有三種主要的微信公眾號抓取方法:
通過(guò)在微信官方平臺上引用文章界面來(lái)爬網(wǎng)第三方官方帳戶(hù)文章聚合網(wǎng)站,并分析微信應用程序的界面以通過(guò)微信公眾平臺訪(fǎng)問(wèn)官方帳戶(hù)文章,并通過(guò)第三方平臺進(jìn)行爬網(wǎng),派對官方帳戶(hù)文章匯總網(wǎng)站
微信公眾號文章未提供外部搜索功能. 直到2013年,在微信對搜狗進(jìn)行投資之后,搜狗搜索才訪(fǎng)問(wèn)了微信官方賬戶(hù)數據. 從那時(shí)起,您可以使用搜狗搜索瀏覽或查詢(xún)相關(guān)的官方帳戶(hù)和文章.
域名是:
搜狗微信
您可以直接搜索官方帳戶(hù)或文章的關(guān)鍵字,一些流行的官方帳戶(hù)會(huì )及時(shí)更新,幾乎與微信同步.
官方帳戶(hù)搜索
因此,您可以使用搜狗微信界面對一些流行的官方賬戶(hù)進(jìn)行爬網(wǎng),但是卻無(wú)法搜索到某些利基官方賬戶(hù),并且搜狗的反爬網(wǎng)機制更頻繁地更新,并且獲取數據的界面變化更快,通常會(huì )在兩三個(gè)月內進(jìn)行調整,這使得履帶易于懸掛. 建議使用硒進(jìn)行爬網(wǎng). 此外,搜狗還對每個(gè)IP都有訪(fǎng)問(wèn)限制. 頻率過(guò)高的IP的訪(fǎng)問(wèn)將被阻止24小時(shí),您需要購買(mǎi)一個(gè)IP池來(lái)處理它.
還有一些其他公共帳戶(hù)文章聚合網(wǎng)站(例如門(mén)戶(hù))未及時(shí)更新或未包括在內. 畢竟,搜狗的兒子不好. 通過(guò)微信公眾平臺引用文章界面
此界面是相對隱藏的,不能匿名訪(fǎng)問(wèn). 必須有一個(gè)官方帳戶(hù). 最好注冊一個(gè)新的官方帳戶(hù),以免被阻止.
讓我們從特定步驟開(kāi)始: 首先登錄您的微信官方帳戶(hù),在您輸入的主頁(yè)上選擇“創(chuàng )建群發(fā)”,然后單擊自行創(chuàng )建的圖形,然后在文章編輯工具欄中找到超鏈接,如下所示: 如下所示:
單擊超鏈接
單擊超鏈接按鈕,將彈出一個(gè)對話(huà)框,選擇鏈接輸入法以查找文章,如下所示:
查找文章
您可以在此處輸入官方帳戶(hù)的名稱(chēng),然后按Enter鍵,微信將返回匹配的官方帳戶(hù)列表,如下所示:
搜索官方帳戶(hù)
然后單擊您要獲取的官方帳戶(hù),然后將顯示特定文章的列表. 它已經(jīng)按時(shí)間倒序排列,而最新的文章是第一篇. 如下圖所示:
文章列表
微信的傳呼機制很奇怪. 每個(gè)官方帳戶(hù)的每個(gè)頁(yè)面上顯示的數據項數量是不同的. 分頁(yè)爬網(wǎng)時(shí)需要處理它.
通過(guò)chrome分析網(wǎng)絡(luò )請求的數據,我們基本獲得了所需的數據,文章鏈接,封面,發(fā)行日期,字幕等,如下所示:
網(wǎng)絡(luò )請求數據
好的,此爬網(wǎng)方法的原理已經(jīng)完成,讓我們開(kāi)始實(shí)際的操作.
由于微信公眾平臺的登錄驗證比較嚴格,在輸入密碼后,手機必須掃描密碼進(jìn)行確認登錄,因此最好使用硒進(jìn)行自動(dòng)化. 我不會(huì )列出特定微信界面的分析過(guò)程,而是直接發(fā)布代碼:
import re
import time
import random
import traceback
import requests
from selenium import webdriver
class Spider(object):
'''
微信公眾號文章爬蟲(chóng)
'''
def __init__(self):
# 微信公眾號賬號
self.account = '286394973@qq.com'
# 微信公眾號密碼
self.pwd = 'lei4649861'
def create_driver(self):
'''
初始化 webdriver
'''
options = webdriver.ChromeOptions()
# 禁用gpu加速,防止出一些未知bug
options.add_argument('--disable-gpu')
# 這里我用 chromedriver 作為 webdriver
# 可以去 http://chromedriver.chromium.org/downloads 下載你的chrome對應版本
self.driver = webdriver.Chrome(executable_path='./chromedriver', chrome_options=options)
# 設置一個(gè)隱性等待 5s
self.driver.implicitly_wait(5)
def log(self, msg):
'''
格式化打印
'''
print('------ %s ------' % msg)
def login(self):
'''
登錄拿 cookies
'''
try:
self.create_driver()
# 訪(fǎng)問(wèn)微信公眾平臺
self.driver.get('https://mp.weixin.qq.com/')
# 等待網(wǎng)頁(yè)加載完畢
time.sleep(3)
# 輸入賬號
self.driver.find_element_by_xpath("./*//input[@name='account']").clear()
self.driver.find_element_by_xpath("./*//input[@name='account']").send_keys(self.account)
# 輸入密碼
self.driver.find_element_by_xpath("./*//input[@name='password']").clear()
self.driver.find_element_by_xpath("./*//input[@name='password']").send_keys(self.pwd)
# 點(diǎn)擊登錄
self.driver.find_elements_by_class_name('btn_login')[0].click()
self.log("請拿手機掃碼二維碼登錄公眾號")
# 等待手機掃描
time.sleep(10)
self.log("登錄成功")
# 獲取cookies 然后保存到變量上,后面要用
self.cookies = dict([[x['name'], x['value']] for x in self.driver.get_cookies()])
except Exception as e:
traceback.print_exc()
finally:
# 退出 chorme
self.driver.quit()
def get_article(self, query=''):
try:
url = 'https://mp.weixin.qq.com'
# 設置headers
headers = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"
}
# 登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,
# 從這里獲取token信息
response = requests.get(url=url, cookies=self.cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
time.sleep(2)
self.log('正在查詢(xún)[ %s ]相關(guān)公眾號' % query)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
# 搜索微信公眾號接口需要傳入的參數,
# 有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
params = {
'action': 'search_biz',
'token': token,
'random': random.random(),
'query': query,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'begin': '0',
'count': '5'
}
# 打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
response = requests.get(search_url, cookies=self.cookies, headers=headers, params=params)
time.sleep(2)
# 取搜索結果中的第一個(gè)公眾號
lists = response.json().get('list')[0]
# 獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get('fakeid')
nickname = lists.get('nickname')
# 微信公眾號文章接口地址
search_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
# 搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
params = {
'action': 'list_ex',
'token': token,
'random': random.random(),
'fakeid': fakeid,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'begin': '0', # 不同頁(yè),此參數變化,變化規則為每頁(yè)加5
'count': '5',
'query': '',
'type': '9'
}
self.log('正在查詢(xún)公眾號[ %s ]相關(guān)文章' % nickname)
# 打開(kāi)搜索的微信公眾號文章列表頁(yè)
response = requests.get(search_url, cookies=self.cookies, headers=headers, params=params)
time.sleep(2)
for per in response.json().get('app_msg_list', []):
print('title ---> %s' % per.get('title'))
print('link ---> %s' % per.get('link'))
# print('cover ---> %s' % per.get('cover'))
except Exception as e:
traceback.print_exc()
if __name__ == '__main__':
spider = Spider()
spider.login()
spider.get_article('python')
該代碼僅用于學(xué)習,不適用于分頁(yè)查詢(xún).
根據網(wǎng)民的說(shuō)法,該接口也有訪(fǎng)問(wèn)頻率限制. 一天幾百次不是問(wèn)題. 如果訪(fǎng)問(wèn)速度太快或次數太多,它將被阻止24小時(shí).