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

問題描述

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

注意點

  1. 搜狗微信獲取的地址為臨時鏈接,具有時效性。
  2. 公眾號為動態網頁(JavaScript渲染),使用requests.get()獲取的內容是不含推送消息的,這里使用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)
    # 獲取網頁信息
    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

# 創建文件夾存儲html網頁,以時間命名
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))
        # 讀取第一篇文章內容
        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. 針對靜態網頁,利用requests獲取html文件,再用BeautifulSoup選擇需要的內容
  3. 針對動態網頁,利用selenium+PhantomJS獲取html文件,再用BeautifulSoup選擇需要的內容
  4. 遇到驗證碼(CAPTCHA),輸出提示。此版本代碼沒有對驗證碼做實際處理,需要人為訪問后,再跑程序,才能避開驗證碼。

文件寫入

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

參考鏈接:

  1. 文件夾創建: 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參數理由: https://stackoverflow.com/questions/2665866/what-is-the-wb-mean-in-this-code-using-python
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容