python爬蟲_微信公眾號推送信息爬取的實例
問題描述
利用搜狗的微信搜索抓取指定公眾號的最新一條推送,并保存相應(yīng)的網(wǎng)頁至本地。
注意點
搜狗微信獲取的地址為臨時鏈接,具有時效性。
公眾號為動態(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[0]['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):
myfile = open("{}/{}_{}.html".format(path, account, title), '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("標(biāo)題: {}\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輸出

Finder

分析
鏈接獲取
首先進入搜狗的微信搜索頁面,在地址欄中提取需要的部分鏈接,字符串連接公眾號名稱,即可生成請求鏈接
針對靜態(tài)網(wǎng)頁,利用requests獲取html文件,再用BeautifulSoup選擇需要的內(nèi)容
針對動態(tài)網(wǎng)頁,利用selenium+PhantomJS獲取html文件,再用BeautifulSoup選擇需要的內(nèi)容
遇到驗證碼(CAPTCHA),輸出提示。此版本代碼沒有對驗證碼做實際處理,需要人為訪問后,再跑程序,才能避開驗證碼。
文件寫入
使用os.path.join()構(gòu)造存儲路徑可以提高通用性。比如Windows路徑分隔符使用back slash(\), 而OS X 和 Linux使用forward slash(/),通過該函數(shù)能根據(jù)平臺進行自動轉(zhuǎn)換。
open()使用b(binary mode)參數(shù)同樣為了提高通用性(適應(yīng)Windows)
使用datetime.now()獲取當(dāng)前時間進行命名,并通過strftime()格式化時間(函數(shù)名中的f代表format),
具體使用參考下表(摘自 Automate the Boring Stuff with Python)

以上這篇python爬蟲_微信公眾號推送信息爬取的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文帶你搞懂Python中isinstance和type的區(qū)別
在Python中,我們經(jīng)常需要檢查一個對象的類型,Python提供了兩種方法來獲取對象的類型:isinstance和type,這兩種方法有什么區(qū)別呢,本文將詳細介紹這兩種方法的區(qū)別和使用,需要的朋友可以參考下2023-06-06
python日期時間轉(zhuǎn)為字符串或者格式化輸出的實例
今天小編就為大家分享一篇python日期時間轉(zhuǎn)為字符串或者格式化輸出的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
詳解Python結(jié)合Genetic?Algorithm算法破解網(wǎng)易易盾拼圖驗證
很多網(wǎng)站在登錄或者注冊時都會遇到拼圖驗證碼,這種拼圖驗證碼實際上是多個小碎片經(jīng)過重新組合成的一張整體。本文將和大家分享一個基于Python?Genetic?Algorithm的破解拼圖驗證碼的辦法,需要的可以參考一下2022-02-02
Python?Apschedule定時任務(wù)框架的用法詳解
apschedule是一個用python寫的定時處理框架,這篇文章主要為大家詳細介紹了Apschedule定時任務(wù)框架的用法,感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06

