微信公眾號(hào)文章爬取方法匯總(上)

爬蟲

經(jīng)常有朋友需要幫忙做公眾號(hào)文章爬取孤钦,這次來做一個(gè)各種方法的匯總說明。
目前爬取微信公眾號(hào)的方法主要有3種:

  1. 通過爬取第三方的公眾號(hào)文章聚合網(wǎng)站
  2. 通過微信公眾平臺(tái)引用文章接口
  3. 通過抓包程序紧武,分析微信app訪問公眾號(hào)文章的接口

通過第三方的公眾號(hào)文章聚合網(wǎng)站爬取

微信公眾號(hào)文章一直沒有提供一個(gè)對(duì)外的搜索功能,直到2013年微信投資搜狗之后敏储,搜狗搜索接入微信公眾號(hào)數(shù)據(jù)阻星,從此使用搜狗搜索就可以瀏覽或查詢到相關(guān)公眾號(hào)以及文章。
域名是: https://weixin.sogou.com/

搜狗微信

可以直接搜索公眾號(hào)或者文章的關(guān)鍵字已添,一些熱門的公眾號(hào)更新還是很及時(shí)的妥箕,幾乎做到了和微信同步。
公眾號(hào)搜索

所以更舞,爬一些熱門公眾號(hào)可以使用搜狗微信的接口來做畦幢,但是一些小眾公眾號(hào)是搜索不到的,而且搜狗的防爬機(jī)制更新的比較勤缆蝉,獲取數(shù)據(jù)的接口變化的比較快宇葱,經(jīng)常兩三個(gè)月就有調(diào)整,導(dǎo)致爬蟲很容易掛刊头,這里還是建議使用 selenium 爬比較省心贝搁。另外搜狗對(duì)每個(gè)ip也有訪問限制,訪問太頻ip會(huì)被封禁24小時(shí)芽偏,需要買個(gè)ip池來做應(yīng)對(duì)雷逆。
還有一些其他公眾號(hào)文章聚合網(wǎng)站(比如傳送門)也都存在更新不及時(shí)或者沒有收錄的問題,畢竟搜狗這個(gè)親兒子都不行污尉。

通過微信公眾平臺(tái)引用文章接口

這個(gè)接口比較隱蔽而且沒法匿名訪問膀哲,所有得有一個(gè)公眾號(hào)往产,建議新注冊(cè)一個(gè)公眾號(hào)比較好,免得被封某宪。
下面開始具體步驟:首先登錄自己的微信公眾號(hào)仿村,在進(jìn)去的首頁選擇新建群發(fā),然后再點(diǎn)擊自建圖文兴喂,在文章編輯工具欄中找到超鏈接蔼囊,如下圖:

點(diǎn)擊超鏈接

點(diǎn)擊這個(gè)超鏈接按鈕,就會(huì)彈出一個(gè)對(duì)話框衣迷,鏈接輸入方式這一項(xiàng)選中查找文章畏鼓,如下圖:
查找文章

到這里就可以輸入公眾號(hào)的名字,回車之后微信就會(huì)返回相匹配的公眾號(hào)列表壶谒,如下圖:
搜索公眾號(hào)

接著點(diǎn)擊你想抓取的公眾號(hào)云矫,就會(huì)顯示具體的文章列表了,已經(jīng)是按時(shí)間倒序了汗菜,最新的文章就是第一條了让禀。如下圖:
文章列表

微信的分頁機(jī)制比較奇怪,每個(gè)公眾號(hào)的每頁顯示的數(shù)據(jù)條數(shù)是不一樣的陨界,分頁爬的時(shí)候要處理一下巡揍。
通過chrome分析網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù),我們想要的數(shù)據(jù)已經(jīng)基本拿到了菌瘪,文章鏈接腮敌、封面、發(fā)布日期麻车、副標(biāo)題等,如下圖:
網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)

OK斗这,這種方法爬取的原理講完了动猬,下面開始實(shí)操了??。
由于微信公眾平臺(tái)登錄驗(yàn)證比較嚴(yán)格表箭,輸入密碼之后還必須要手機(jī)掃碼確認(rèn)才能登錄進(jìn)去赁咙,所以最好還是使用selenium做自動(dòng)化比較好。具體微信接口的分析過程我就不列了免钻,直接貼代碼了:

import re
import time
import random
import traceback
import requests

from selenium import webdriver


class Spider(object):
    '''
    微信公眾號(hào)文章爬蟲
    '''

    def __init__(self):
        # 微信公眾號(hào)賬號(hào)
        self.account = ''
        # 微信公眾號(hào)密碼
        self.pwd = ''

    def create_driver(self):
        '''
        初始化 webdriver
        '''
        options = webdriver.ChromeOptions()
        # 禁用gpu加速彼水,防止出一些未知bug
        options.add_argument('--disable-gpu')

        # 這里我用 chromedriver 作為 webdriver
        # 可以去 http://chromedriver.chromium.org/downloads 下載你的chrome對(duì)應(yīng)版本
        self.driver = webdriver.Chrome(executable_path='./chromedriver', chrome_options=options)
        # 設(shè)置一個(gè)隱性等待 5s
        self.driver.implicitly_wait(5)

    def log(self, msg):
        '''
        格式化打印
        '''
        print('------ %s ------' % msg)

    def login(self):
        '''
        登錄拿 cookies
        '''
        try:
            self.create_driver()
            # 訪問微信公眾平臺(tái)
            self.driver.get('https://mp.weixin.qq.com/')
            # 等待網(wǎng)頁加載完畢
            time.sleep(3)
            # 輸入賬號(hào)
            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("請(qǐng)拿手機(jī)掃碼二維碼登錄公眾號(hào)")
            # 等待手機(jī)掃描
            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'
            # 設(shè)置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"
            }
            # 登錄之后的微信公眾號(hào)首頁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('正在查詢[ %s ]相關(guān)公眾號(hào)' % query)
            search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
            # 搜索微信公眾號(hào)接口需要傳入的參數(shù)凤覆,
            # 有三個(gè)變量:微信公眾號(hào)token、隨機(jī)數(shù)random拆魏、搜索的微信公眾號(hào)名字
            params = {
                'action': 'search_biz',
                'token': token,
                'random': random.random(),
                'query': query,
                'lang': 'zh_CN',
                'f': 'json',
                'ajax': '1',
                'begin': '0',
                'count': '5'
            }
            # 打開搜索微信公眾號(hào)接口地址盯桦,需要傳入相關(guān)參數(shù)信息如:cookies慈俯、params、headers
            response = requests.get(search_url, cookies=self.cookies, headers=headers, params=params)
            time.sleep(2)
            # 取搜索結(jié)果中的第一個(gè)公眾號(hào)
            lists = response.json().get('list')[0]
            # 獲取這個(gè)公眾號(hào)的fakeid拥峦,后面爬取公眾號(hào)文章需要此字段
            fakeid = lists.get('fakeid')
            nickname = lists.get('nickname')

            # 微信公眾號(hào)文章接口地址
            search_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'

            # 搜索文章需要傳入幾個(gè)參數(shù):登錄的公眾號(hào)token贴膘、要爬取文章的公眾號(hào)fakeid、隨機(jī)數(shù)random
            params = {
                'action': 'list_ex',
                'token': token,
                'random': random.random(),
                'fakeid': fakeid,
                'lang': 'zh_CN',
                'f': 'json',
                'ajax': '1',
                'begin': '0',  # 不同頁略号,此參數(shù)變化刑峡,變化規(guī)則為每頁加5
                'count': '5',
                'query': '',
                'type': '9'
            }
            self.log('正在查詢公眾號(hào)[ %s ]相關(guān)文章' % nickname)
            # 打開搜索的微信公眾號(hào)文章列表頁
            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é)習(xí)使用,沒有做分頁查詢之類玄柠。
據(jù)網(wǎng)友稱突梦,這個(gè)接口也有訪問頻次限制,一天幾百次還是沒啥問題随闪,太快或者太多次訪問就會(huì)被封24小時(shí)阳似。

下一篇我們來講講如何獲取文章的閱讀數(shù)和點(diǎn)贊數(shù)。

參考文章

https://segmentfault.com/a/1190000015642808
https://cuiqingcai.com/4652.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铐伴,一起剝皮案震驚了整個(gè)濱河市撮奏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌当宴,老刑警劉巖畜吊,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異户矢,居然都是意外死亡玲献,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門梯浪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌年,“玉大人,你說我怎么就攤上這事挂洛±裨ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵虏劲,是天一觀的道長托酸。 經(jīng)常有香客問我,道長柒巫,這世上最難降的妖魔是什么励堡? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮堡掏,結(jié)果婚禮上应结,老公的妹妹穿的比我還像新娘。我一直安慰自己泉唁,他們只是感情好摊趾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布币狠。 她就那樣靜靜地躺著,像睡著了一般砾层。 火紅的嫁衣襯著肌膚如雪漩绵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天肛炮,我揣著相機(jī)與錄音止吐,去河邊找鬼。 笑死侨糟,一個(gè)胖子當(dāng)著我的面吹牛碍扔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秕重,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼不同,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溶耘?” 一聲冷哼從身側(cè)響起二拐,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凳兵,沒想到半個(gè)月后百新,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庐扫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年饭望,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片形庭。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铅辞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萨醒,到底是詐尸還是另有隱情斟珊,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布验靡,位于F島的核電站倍宾,受9級(jí)特大地震影響雏节,放射性物質(zhì)發(fā)生泄漏胜嗓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一钩乍、第九天 我趴在偏房一處隱蔽的房頂上張望辞州。 院中可真熱鬧,春花似錦寥粹、人聲如沸变过。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媚狰。三九已至岛杀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崭孤,已是汗流浹背类嗤。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辨宠,地道東北人遗锣。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像嗤形,于是被迫代替她去往敵國和親精偿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容