我的之前的一篇文章介紹了怎么用anyproxy中間人代理的方法來(lái)爬取微信公眾號(hào),現(xiàn)在有另一種方法吴汪,原理是通過(guò)網(wǎng)頁(yè)微信激捏,用的是wxpy框架,wxpy框架是一個(gè)微信聊天機(jī)器人框架沧竟,wxpy框架基于itchat框架,itchat框架也是一個(gè)微信聊天機(jī)器人框架缚忧,wxpy框架是改進(jìn)了itchat框架的微信聊天機(jī)器人框架悟泵,其實(shí)wxpy框架也能很方便地獲取到公眾號(hào)文章的推送。項(xiàng)目的源碼:https://github.com/zjhpure/crawler_public_number_web
1闪水、先說(shuō)流程糕非,使用wxpy框架掃二維碼--登錄網(wǎng)頁(yè)微信--掛著網(wǎng)頁(yè)微信--接收網(wǎng)頁(yè)微信的各種推送--判斷推送是否為公眾號(hào)最新文章推送,若是就進(jìn)行各種過(guò)濾操作后入庫(kù)。
2朽肥、關(guān)鍵代碼很簡(jiǎn)單禁筏,不超過(guò)50行,還能很實(shí)時(shí)地接收到公眾號(hào)文章的最新推送衡招,
# coding: utf-8
from wxpy import *
# 初始化機(jī)器人篱昔,掃碼登陸,在命令行上登錄console_qr參數(shù)必須設(shè)置為True
# 因?yàn)樵诿钚械卿洸粫?huì)彈出二維碼圖片始腾,只會(huì)在命令行上直接生成二維碼
bot = Bot(console_qr=True)
# 打印來(lái)自其他好友州刽、群聊和公眾號(hào)的消息
@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()
但是目前有個(gè)缺陷,article里沒(méi)有文章的發(fā)表時(shí)間浪箭,這一點(diǎn)我覺(jué)得有些奇怪穗椅,因?yàn)槲彝ㄟ^(guò)抓包網(wǎng)頁(yè)微信是看到有公眾號(hào)文章推送的時(shí)間戳的,按理說(shuō)這里的article應(yīng)該要有個(gè)發(fā)表時(shí)間的屬性的奶栖。以下是wxpy框架articles方法的源碼匹表,
@property
def articles(self):
"""
公眾號(hào)推送中的文章列表 (首篇的 標(biāo)題/地址 與消息中的 text/url 相同)
其中,每篇文章均有以下屬性:
* `title`: 標(biāo)題
* `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
并沒(méi)有發(fā)表時(shí)間的這一屬性宣鄙。因?yàn)閣xpy框架是基于itchat框架的袍镀,所以有可能是wxpy框架沒(méi)有繼承到itchat里的文章發(fā)表時(shí)間數(shù)據(jù),或者itchat框架本身就沒(méi)有文章發(fā)表時(shí)間數(shù)據(jù)框冀。這個(gè)問(wèn)題可以有一個(gè)折中的解決方法流椒,如果文章的發(fā)表時(shí)間的準(zhǔn)確性對(duì)于你的業(yè)務(wù)來(lái)說(shuō)沒(méi)有多大影響的,可以用接收到推送的時(shí)間作為文章的發(fā)表時(shí)間明也,但是如果文章發(fā)表時(shí)間的準(zhǔn)確性很重要就不行了宣虾,因?yàn)榻邮盏酵扑偷臅r(shí)間會(huì)有延遲,而且也可能會(huì)出現(xiàn)凌晨前發(fā)出的文章温数,凌晨后爬蟲(chóng)服務(wù)器才接收到推送绣硝,那發(fā)表時(shí)間的日期就錯(cuò)了,而且也會(huì)有可能爬蟲(chóng)服務(wù)器的時(shí)間本身就出錯(cuò)了撑刺。
3鹉胖、用網(wǎng)頁(yè)微信這種方法來(lái)爬取公眾號(hào),只能爬取到最新推送的公眾號(hào)文章够傍,不能爬取公眾號(hào)歷史消息甫菠,因?yàn)榫W(wǎng)頁(yè)微信本身就沒(méi)有查看公眾號(hào)歷史消息的功能,但是這種方法卻能很及時(shí)地爬取到公眾號(hào)的最新推送冕屯,但是一旦爬取時(shí)出了錯(cuò)寂诱,就無(wú)法挽回了。這種方法還要注意封號(hào)的問(wèn)題安聘,不能掛著時(shí)間太長(zhǎng)痰洒,因?yàn)橐粋€(gè)正常的微信號(hào)是不會(huì)很長(zhǎng)時(shí)間掛著網(wǎng)頁(yè)微信的瓢棒,可以嘗試用多個(gè)微信號(hào)輪流切換著掛網(wǎng)頁(yè)微信。這種方法用來(lái)登錄網(wǎng)頁(yè)微信的微信號(hào)條件要比anyproxy中間人代理的方法高丘喻,印象中微信號(hào)需要綁定銀行卡才可以脯宿。
4、其實(shí)爬取公眾號(hào)不能只用一種方法的泉粉,只用一種方法存在很大的風(fēng)險(xiǎn)连霉,是需要多種方法結(jié)合一起用的,多種方法競(jìng)爭(zhēng)獲取文章列表源搀继,添加到redis文章隊(duì)列中窘面,再由另外一個(gè)服務(wù)不斷地獲取redis文章隊(duì)列來(lái)爬取文章翠语,詳細(xì)請(qǐng)看接下來(lái)的文章分析叽躯。