微信公眾號推送信息爬取---python爬蟲

問題描述

利用搜狗的微信搜索抓取指定公眾號的最新一條推送,并保存相應的網(wǎng)頁至本地。

注意點

  1. 搜狗微信獲取的地址為臨時鏈接赵辕,具有時效性履因。
  2. 公眾號為動態(tài)網(wǎng)頁(JavaScript渲染),使用requests.get()獲取的內(nèi)容是不含推送消息的馒铃,這里使用selenium+PhantomJS處理

代碼

#! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys

# 獲取公眾號鏈接
def getAccountURL(searchURL):
    res = requests.get(searchURL)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text, "lxml")
    # 選擇第一個鏈接
    account = soup.select('a[uigs="account_name_0"]')
    return account[0]['href']

# 獲取首篇文章的鏈接蟹腾,如果有驗證碼返回None
def getArticleURL(accountURL):
    browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
    # 進入公眾號
    browser.get(accountURL)
    # 獲取網(wǎng)頁信息
    html = browser.page_source
    accountSoup = bs4.BeautifulSoup(html, "lxml")
    time.sleep(1)
    contents = accountSoup.find_all(hrefs=True)
    try:
        partitialLink = contents[1]['hrefs']
        firstLink = base + partitialLink
    except IndexError:
        firstLink = None 
        print('CAPTCHA!')
    return firstLink

# 創(chuàng)建文件夾存儲html網(wǎng)頁痕惋,以時間命名
def folderCreation():
    path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
    try:
        os.makedirs(path)
    except OSError as e:
        if e.errno != errno.EEXIST:
            raise
        print("folder not exist!")
    return path

# 將html頁面寫入本地
def writeToFile(path, account, title):
    pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
    myfile = open(pathToWrite, 'wb')
    myfile.write(res.content)
    myfile.close()

base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='

path = folderCreation()

for index, account in enumerate(accountList):
    searchURL = query + account
    accountURL = getAccountURL(searchURL)
    time.sleep(10)
    articleURL = getArticleURL(accountURL)
    if articleURL != None:
        print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
        # 讀取第一篇文章內(nèi)容
        res = requests.get(articleURL)
        res.raise_for_status()
        detailPage = bs4.BeautifulSoup(res.text, "lxml")
        title = detailPage.title.text
        print("標題: {}\n鏈接: {}\n".format(title, articleURL))
        writeToFile(path, account, title)
    else:
        print('{} files successfully written to {}'.format(index, path))
        sys.exit()

print('{} files successfully written to {}'.format(len(accountList), path))

參考輸出

  • Terminal輸出
Terminal輸出
  • Finder
寫入的html文件

分析

鏈接獲取

  1. 首先進入搜狗的微信搜索頁面,在地址欄中提取需要的部分鏈接岭佳,字符串連接公眾號名稱血巍,即可生成請求鏈接
  2. 針對靜態(tài)網(wǎng)頁,利用requests獲取html文件珊随,再用BeautifulSoup選擇需要的內(nèi)容
  3. 針對動態(tài)網(wǎng)頁述寡,利用selenium+PhantomJS獲取html文件,再用BeautifulSoup選擇需要的內(nèi)容
  4. 遇到驗證碼(CAPTCHA)叶洞,輸出提示鲫凶。此版本代碼沒有對驗證碼做實際處理,需要人為訪問后衩辟,再跑程序螟炫,才能避開驗證碼。

文件寫入

  1. 使用os.path.join()構(gòu)造存儲路徑可以提高通用性艺晴。比如Windows路徑分隔符使用back slash(\)昼钻, 而OS XLinux使用forward slash(/),通過該函數(shù)能根據(jù)平臺進行自動轉(zhuǎn)換封寞。
  2. open()使用b(binary mode)參數(shù)同樣為了提高通用性(適應Windows)
  3. 使用datetime.now()獲取當前時間進行命名然评,并通過strftime()格式化時間(函數(shù)名中的f代表format),具體使用參考下表(摘自 Automate the Boring Stuff with Python)
strftime()

參考鏈接:

  1. 文件夾創(chuàng)建: https://stackoverflow.com/questions/14115254/creating-a-folder-with-timestamp
  2. 異常處理的使用: https://stackoverflow.com/questions/2574636/getting-a-default-value-on-index-out-of-range-in-python
  3. enumerate的使用: https://stackoverflow.com/questions/3162271/get-loop-count-inside-a-python-for-loop
  4. open()使用b參數(shù)理由: https://stackoverflow.com/questions/2665866/what-is-the-wb-mean-in-this-code-using-python
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狈究,一起剝皮案震驚了整個濱河市碗淌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抖锥,老刑警劉巖亿眠,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磅废,居然都是意外死亡纳像,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門拯勉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爹耗,“玉大人,你說我怎么就攤上這事谜喊√妒蓿” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵斗遏,是天一觀的道長山卦。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么账蓉? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任枚碗,我火速辦了婚禮,結(jié)果婚禮上铸本,老公的妹妹穿的比我還像新娘肮雨。我一直安慰自己,他們只是感情好箱玷,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布怨规。 她就那樣靜靜地躺著,像睡著了一般锡足。 火紅的嫁衣襯著肌膚如雪波丰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天舶得,我揣著相機與錄音掰烟,去河邊找鬼。 笑死沐批,一個胖子當著我的面吹牛纫骑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播九孩,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼先馆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捻撑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缤底,失蹤者是張志新(化名)和其女友劉穎顾患,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體个唧,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡江解,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了徙歼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犁河。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖魄梯,靈堂內(nèi)的尸體忽然破棺而出桨螺,到底是詐尸還是另有隱情,我是刑警寧澤酿秸,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布灭翔,位于F島的核電站,受9級特大地震影響辣苏,放射性物質(zhì)發(fā)生泄漏肝箱。R本人自食惡果不足惜哄褒,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煌张。 院中可真熱鬧呐赡,春花似錦、人聲如沸骏融。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绎谦。三九已至管闷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窃肠,已是汗流浹背包个。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冤留,地道東北人碧囊。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像纤怒,于是被迫代替她去往敵國和親糯而。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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