知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 公眾號相關(guān) >
Python爬蟲案例:爬取微信公眾號文章
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):52
本文的文字及圖片來源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,如有問題請及時聯(lián)系我們以作處理。
文章轉(zhuǎn)載于公眾號:早起Python
作者:陳熹
大家好,今天我們來講點Selenium自動化,你是否有特別喜歡的公眾號?你有想過如何將一個公眾號歷史文章全部文章爬下來學(xué)習(xí)嗎?現(xiàn)在我們就演示用Selenium實現(xiàn)這個功能。
下面就來詳細(xì)講解如何一步步操作,文末附完整代碼。
Selenium介紹
Selenium是一個用于web應(yīng)用程序自動化測試的工具,直接運行在瀏覽器當(dāng)中,可以通過代碼控制與頁面上元素進行交互,并獲取對應(yīng)的信息。Selenium很大的一個優(yōu)點是:不需要復(fù)雜地構(gòu)造請求,訪問參數(shù)跟使用瀏覽器的正常用戶一模一樣,訪問行為也相對更像正常用戶,不容易被反爬蟲策略命中,所見即所得。而且在抓取的過程中,必要時還可人工干預(yù)(比如登錄、輸入驗證碼等)。
Selenium常常是面對一個嚴(yán)格反爬網(wǎng)站無從入手時的保留武器。當(dāng)然也有缺點:操作均需要等待頁面加載完畢后才可以繼續(xù)進行,所以速度要慢,效率不高(某些情況下使用headless和無圖模式會提高一點效率)。
需求分析和代碼實現(xiàn)
需求很明確:獲取一個公眾號全部推文的標(biāo)題、日期、鏈接。微信自身的推文功能只能通過其App查看,對App的抓取比較復(fù)雜。有一個很方便的替代途徑就是通過搜狗微信檢索。不過如果直接使用Requests等庫直接請求,會涉及的反爬措施有cookie設(shè)置,js加密等等,所以今天就利用Selenium大法!
首先導(dǎo)入所需的庫和實例化瀏覽器對象:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 導(dǎo)入第2-4行是為了馬上會提到的 顯式等待
import time
import datetime
driver = webdriver.Chrome()
driver.get('https://weixin.sogou.com/')
上述的代碼就可以實現(xiàn)打開搜狗微信搜索的操作,接下來需要往搜索框里輸入文字,并且點擊“搜文章”(不直接點搜公眾號是因為已經(jīng)取消通過公眾號直接獲取相應(yīng)文章的功能)
wait = WebDriverWait(driver, 10)
input = wait.until(EC.presence_of_element_located((By.NAME, 'query')))
input.send_keys('早起Python')
driver.find_element_by_xpath("//input[@class='swz']").click()
邏輯是設(shè)定最長等待時間,在10s內(nèi)發(fā)現(xiàn)了輸入框已經(jīng)加載出來后就輸入公眾號名稱,這里我們以“早起Python”為例,并且根據(jù)“搜文章”按鈕的xpath獲取該位置并點擊,這里就用到了顯式等待。Selenium請求網(wǎng)頁等待響應(yīng)受到網(wǎng)速牽制,如果元素未加載全而代碼執(zhí)行過快就會意外報錯而終止,解決方式是等待。
隱式等待是在嘗試發(fā)現(xiàn)某個元素的時候,如果沒能立刻發(fā)現(xiàn),就等待固定長度的時間driver.implicitly_wait(10),顯示等待明確了等待條件,只有該條件觸發(fā),才執(zhí)行后續(xù)代碼,如這里我用到的代碼,當(dāng)然也可以用time模塊之間設(shè)定睡眠時間,睡完了再運行后續(xù)代碼。
另外只能獲取前10頁100條的結(jié)果,查看后續(xù)頁面需要微信掃碼登錄:
因此從這里開始,代碼的執(zhí)行邏輯為:
- 第10頁遍歷完成后自動點擊登錄,此時需要人工介入,掃碼完成登錄
- 代碼檢測登錄是否完成(可以簡化為識別“下一頁”按鈕是否出現(xiàn)),如果登錄完成則繼續(xù)從11頁遍歷到最后一頁(沒有“下一頁”按鈕)
由于涉及兩次遍歷則可以將解析信息包裝成函數(shù):
num = 0
def get_news():
global num # 放全局變量是為了給符合條件的文章記序
time.sleep(1)
news_lst = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
for news in news_lst:
# 獲取公眾號來源
source = news.find_elements_by_xpath('div[2]/div/a')[0].text
if '早起' not in source:
continue
num += 1
# 獲取文章標(biāo)題
title = news.find_elements_by_xpath('div[2]/h3/a')[0].text
# 獲取文章發(fā)表日期
date = news.find_elements_by_xpath('div[2]/div/span')[0].text
# 文章發(fā)表的日期如果較近可能會顯示“1天前” “12小時前” “30分鐘前”
# 這里可以用`datetime`模塊根據(jù)時間差求出具體時間
# 然后解析為`YYYY-MM-DD`格式
if '前' in date:
today = datetime.datetime.today()
if '天' in date:
delta = datetime.timedelta(days=int(date[0]))
elif '小時' in date:
delta = datetime.timedelta(hours=int(date.replace('小時前', ' ')))
else:
delta = datetime.timedelta(minutes=int(date.replace('分鐘前', ' ')))
date = str((today - delta).strftime('%Y-%m-%d'))
date = datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m-%d')
# 獲取url
url = news.find_elements_by_xpath('div[2]/h3/a')[0].get_attribute('href')
print(num, title, date)
print(url)
print('-' * 10)
for i in range(10):
get_news()
if i == 9:
# 如果遍歷到第十頁則跳出循環(huán)不需要點擊“下一頁”
break
driver.find_element_by_id("sogou_next").click()
接下來就是點擊“登錄”,然后人工完成掃碼,可以利用while True檢測登錄是否成功,是否出現(xiàn)了下一頁按鈕,如果出現(xiàn)則跳出循環(huán),點擊“下一頁”按鈕并繼續(xù)后面的代碼,否則睡3秒后重復(fù)檢測:
driver.find_element_by_name('top_login').click()
while True:
try:
next_page = driver.find_element_by_id("sogou_next")
break
except:
time.sleep(3)
next_page.click()
效果如圖:
然后就是重新遍歷文章了,由于不知道最后一頁是第幾頁可以使用while循環(huán)反復(fù)調(diào)用解析頁面的函數(shù)半點擊“下一頁”,如果不存在下一頁則結(jié)束循環(huán):
while True:
get_news()
try:
driver.find_element_by_id("sogou_next").click()
except:
break
# 最后退出瀏覽器即可
driver.quit()
是不是少了點什么?對,就是數(shù)據(jù)存儲,在爬下來數(shù)據(jù)之后和之前一樣利用openpyxl存儲到excel中即可(如果不想用此模塊的話也可以改用 csv 或者 pandas 保存表格文件):
相關(guān)案例查看更多
相關(guān)閱讀
- 汽車拆解管理軟件
- 云南手機網(wǎng)站建設(shè)
- 報廢車
- 前端
- php網(wǎng)站
- 網(wǎng)站建設(shè)優(yōu)化
- 做網(wǎng)站
- 小程序開發(fā)排名前十名
- 麗江小程序開發(fā)
- 跳轉(zhuǎn)小程序
- 云南軟件開發(fā)
- 楚雄網(wǎng)站建設(shè)公司
- 河南小程序制作
- 網(wǎng)站建設(shè)需要多少錢
- 重慶網(wǎng)站建設(shè)公司
- 云南省建設(shè)廳網(wǎng)站
- 網(wǎng)站建設(shè)制作
- 云南衛(wèi)視小程序
- 網(wǎng)站建設(shè)費用
- 手機網(wǎng)站建設(shè)
- 小程序模板開發(fā)公司
- 云南網(wǎng)站建設(shè)一條龍
- 云南小程序商城
- 汽車報廢回收
- 企業(yè)網(wǎng)站
- 云南etc微信小程序
- 搜索引擎優(yōu)化
- 云南建設(shè)廳網(wǎng)站首頁
- 用戶登錄
- 商標(biāo)注冊