最簡單的Python爬取微信公衆號(不到50行)

前言

爬取微信公衆號是一個很艱難的工做,這裏說的是最簡單的一種方法,固然也是有不少缺陷的。項目的源碼:github.com/zjhpure/cra…git

原理

經過wxpy框架登陸網頁微信,實時獲取最新的微信公衆號文章。github

背景

wxpy框架是一個微信聊天機器人框架,wxpy框架基於itchat框架,itchat框架也是一個微信聊天機器人框架,wxpy框架是改進了itchat框架的微信聊天機器人框架,在網頁微信中是能夠獲取到最新的微信公衆號推送的,因此用wxpy框架爬取微信公衆號文章也是能夠的。web

源碼

核心代碼很簡單,不超過50行,服務器

# coding: utf-8
from wxpy import *

# 初始化機器人,掃碼登錄,在命令行上登陸console_qr參數必須設置爲True
# 由於在命令行登陸不會彈出二維碼圖片,只會在命令行上直接生成二維碼
bot = Bot(console_qr=True)

# 打印來自其餘好友、羣聊和公衆號的消息
@bot.register()
def print_others(msg):
    print('msg:' + str(msg))
    articles = msg.articles
    if articles is not None:
        for article in articles:
            print('title:' + str(article.title))
            print('summary:' + str(article.summary))
            print('url:' + str(article.url))
            print('cover:' + str(article.cover))

if __name__ == '__main__':
    # 或者僅僅堵塞線程
    bot.join()
複製代碼

運行過程
執行上面代碼後,命令行界面會出現二維碼,打開微信掃二維碼,登陸網頁微信,掛着網頁微信實時接收微信公衆號推送。

注意

這裏有個問題,就是article裏沒有文章的發表時間,這一點我以爲有些奇怪,由於我經過抓包網頁微信是看到有微信公衆號文章推送的時間戳的,按理說這裏的article應該要有個發表時間的屬性的。如下是wxpy框架articles方法的源碼,並無發現有發表時間的這一屬性,微信

@property
def articles(self):
    """
    公衆號推送中的文章列表 (首篇的 標題/地址 與消息中的 text/url 相同)

    其中,每篇文章均有如下屬性:

    * `title`: 標題
    * `summary`: 摘要
    * `url`: 文章 URL
    * `cover`: 封面或縮略圖 URL
    """

    from wxpy import MP
    if self.type == SHARING and isinstance(self.sender, MP):
        tree = ETree.fromstring(self.raw['Content'])
        # noinspection SpellCheckingInspection
        items = tree.findall('.//mmreader/category/item')

        article_list = list()

        for item in items:
            def find_text(tag):
                found = item.find(tag)
                if found is not None:
                    return found.text

            article = Article()
            article.title = find_text('title')
            article.summary = find_text('digest')
            article.url = find_text('url')
            article.cover = find_text('cover')
            article_list.append(article)

        return article_list
複製代碼

由於wxpy框架是基於itchat框架的,因此我推測有多是wxpy框架沒有繼承itchat裏的文章發表時間數據,或者itchat框架自己就沒有文章發表時間的數據。這個問題能夠用一個折中的方法,若是文章的發表時間的準確性對於你的業務來講沒有多大影響的,能夠用接收到推送的時間做爲文章的發表時間,可是若是文章發表時間的準確性很重要就不行了,由於接收到推送的時間會有延遲,並且也可能會出現凌晨前發出的文章,凌晨後爬蟲服務器才接收到推送,那發表時間的日期就錯了,並且也會有可能爬蟲服務器的時間自己就出錯了。app

缺陷

用網頁微信這種方法來爬取微信公衆號,只能爬取到最新推送的公衆號文章,不能爬取微信公衆號歷史消息,由於網頁微信自己就沒有查看微信公衆號歷史消息的功能,可是這種方法卻能很及時地爬取到微信公衆號的最新推送,可是一旦爬取時出了錯,就沒法挽回了。框架

提醒

要注意封號的問題,不能掛着時間太長,由於一個正常的微信號是不會很長時間掛着網頁微信的,能夠嘗試用多個微信號輪流切換着掛網頁微信。微信從大概2017年年尾起,新註冊的微信號都不能登陸網頁微信了,因此只能用舊號。url

後序

微信爬取公衆號不能只用一種方法,只用一種方法存在很大的風險,須要多種方法結合一塊兒用,多種方法競爭獲取文章列表源,添加到文章隊列中,再由另一個服務不斷地獲取文章隊列來爬取文章。spa

相關文章
相關標籤/搜索