Python selenium爬取微信公眾號文章代碼詳解
參照資料:selenium webdriver添加cookie: http://www.dbjr.com.cn/article/193102.html
需求:
想閱讀微信公眾號歷史文章,但是每次找回看得地方不方便。
思路:
1、使用selenium打開微信公眾號歷史文章,并滾動刷新到最底部,獲取到所有歷史文章urls。
2、對urls進行遍歷訪問,并進行下載到本地。
實現(xiàn)
1、打開微信客戶端,點擊某個微信公眾號->進入公眾號->打開歷史文章鏈接(使用瀏覽器打開),并通過開發(fā)者工具獲取到cookies,保存為excel。

2、啟動webdriver,并添加相應(yīng)cookies。
browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)
# 隨便訪問一個地址,然后才能設(shè)置cookies
browser.get('https://httpbin.org/get')
# 添加cookies,df為保存的excel cookies
for i in range(len(df)):
cookie_dict = {
"domain": df.loc[i,'DomaiN'],
'name': df.loc[i,'Name'],
'value': str(df.loc[i,'Value']),
"expires": df.loc[i,"Expires/Max-Age"],
'path': '/',}
browser.add_cookie(cookie_dict)
browser.get(weixin_url)
3、控制瀏覽器下移動
觀察page_source,可以發(fā)現(xiàn),文章到最底部的判斷是。
<div class="loadmore with_line" style="display: none;" id="js_nomore">
<div class="tips_wrp">
<span class="tips js_no_more_msg" style="display: none;">已無更多</span>
<span class="tips js_need_add_contact" style="display: none;">關(guān)注公眾帳號,接收更多消息</span>
</div>
</div>
使用driver控制JS。
%%time
# 通過判斷已無更多的style,來判斷是否到最底部,最終執(zhí)行到最底部
no_more_msg_style = 'display: none;'
while True:
wait.until(EC.presence_of_element_located((By.XPATH,'//span[@class="tips js_no_more_msg" and text()="已無更多"]')))
no_more= browser.find_element_by_xpath('//span[@class="tips js_no_more_msg" and text()="已無更多"]')
now_style = no_more.get_attribute('style')
if str(now_style).find(no_more_msg_style) == -1:
# 說明已經(jīng)加載完了
break
else:
# 停頓一會,等待瀏覽器加載
time.sleep(5)
# 通過JS,執(zhí)行到最底部
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
4、關(guān)鍵信息獲取。
根據(jù)html,分析得出文章url處在<div msgid="1000000026">中。
<div class="weui_msg_card js_card" msgid="1000000026">
<div class="weui_msg_card_hd">2017年1月13日</div>
<div class="weui_msg_card_bd">
<!-- 圖文 -->
<!-- 普通圖文 -->
<div id="WXAPPMSG1000000026" class="weui_media_box appmsg js_appmsg" hrefs="http://mp.weixin.qq.com/s?__biz=MzI5MDQ4NzU5MA==&mid=2247483748&idx=1&sn=e804e638484794181a27c094f81be8e1&chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&scene=38#wechat_redirect" data-t="0">
<span class="weui_media_hd js_media" style="background-image:url(http://mmbiz.qpic.cn/mmbiz_jpg/XibhQ5tjv6dG9B4GF1C9MGBJO5AR2wvjCL9LgdcFgAdEgyU8wZFuDXoH9O9dNvafwK3RibCjUyiarIlUDlkxbcyfQ/640?wx_fmt=jpeg)" data-s="640" hrefs="http://mp.weixin.qq.com/s?__biz=MzI5MDQ4NzU5MA==&mid=2247483748&idx=1&sn=e804e638484794181a27c094f81be8e1&chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&scene=38#wechat_redirect" data-type="APPMSG">
</span>
<div class="weui_media_bd js_media" data-type="APPMSG">
<h4 class="weui_media_title" hrefs="http://mp.weixin.qq.com/s?__biz=MzI5MDQ4NzU5MA==&mid=2247483748&idx=1&sn=e804e638484794181a27c094f81be8e1&chksm=ec1e6d2ddb69e43bd3e1f554c2d0cedb37f099252f122cee1ac5052b589b56f428b2c304de8e&scene=38#wechat_redirect">
承認自己是難民有什么錯
</h4>
<p class="weui_media_desc">枷鎖已經(jīng)足夠沉重,謝絕道德綁架</p>
<p class="weui_media_extra_info">2017年1月13日</p>
</div>
</div>
</div>
</div>
文章類型主要分為,
<div class="weui_media_bd js_media" data-type="APPMSG">
<div class="weui_media_bd js_media" data-type="TEXT">
有無原創(chuàng)進行劃分。
最終實現(xiàn):
%%time
result = []
errlist = []
# 先得到其中一個
el_divs = browser.find_elements_by_xpath('//div[@class="weui_msg_card_list"]/div[@class="weui_msg_card js_card"]')
i = 0
for div in el_divs:
date = title = url = yuanchuang = ''
try:
date = div.find_element_by_xpath('.//div[@class="weui_msg_card_hd"]').get_attribute('innerHTML')
el_content = div.find_element_by_xpath('.//div[@class="weui_media_bd js_media"]')
if el_content.get_attribute('data-type') == 'APPMSG':
el = el_content.find_element_by_xpath('./h4[@class="weui_media_title"]')
title = el.text
url = el.get_attribute('hrefs')
xb = el_content.find_element_by_xpath('./p[@class="weui_media_extra_info"]').text
yuanchuang = '原創(chuàng)' if xb.find('原創(chuàng)') != -1 else ''
elif el_content.get_attribute('data-type') == 'TEXT':
title = '隨文'
url = el_content.find_element_by_xpath('./div').text
yuanchuang = '原創(chuàng)'
else:
# 其他未能識別的類型
errlist.append([i,div.get_attribute('innerHTML')])
except NoSuchElementException:
errlist.append([i,div.get_attribute('innerHTML')])
print(str(i),':',date,title,url,yuanchuang)
result.append([date,title,yuanchuang,url])
i = i + 1
5、將得到url保存到excel
dfout = pd.DataFrame(result, columns=['日期', '標題', '原創(chuàng)', '地址'])
with pd.ExcelWriter(savename) as writer:
dfout.to_excel(writer,index=False,sheet_name = 'Sheet1')
最終保存形式

6、在遍歷最后的鏈接地址,逐個requets保存,即可得到。組建成菜單形式的文章,可參考
記一次 excel vba 參考手冊爬蟲實戰(zhàn),不必要的一次爬蟲。:htthttp://www.dbjr.com.cn/article/193107.htm
遇到的坑:
1、find_element_by_xpath 需要配上 NoSuchElementException 使用,否則遇到未找到的節(jié)點就會出錯,最初find_elements_by_xpath 來防止找不到相關(guān)節(jié)點,結(jié)果發(fā)現(xiàn),執(zhí)行速度異常的慢,需要查找原因。
2、cookies使用的時候是人為獲取,如果太長時間不用,需要重新獲取??梢钥紤]結(jié)合pyautogui來控制weixin客戶端來進行獲取。?
3、構(gòu)建的時候,最后分布試行,最初的文章類型沒有做好判斷,結(jié)果執(zhí)行時間很久。做好異常捕獲,再逐步分析錯誤的節(jié)點問題。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一個簡單的python爬蟲程序 爬取豆瓣熱度Top100以內(nèi)的電影信息
這篇文章主要為大家詳細介紹了一個簡單的python爬蟲程序,爬取豆瓣熱度Top100以內(nèi)的電影信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04
Python使用dis模塊把Python反編譯為字節(jié)碼的用法詳解
通常來說Python的性能或代碼質(zhì)量的評估可以通過dis模塊獲取到對應(yīng)的字節(jié)碼指令來進行評估,因而這里我們就來看一下Python使用dis模塊把Python反編譯為字節(jié)碼的用法詳解:2016-06-06
VSCode中Python環(huán)境配置、創(chuàng)建虛擬環(huán)境及pip的一些常用命令
這篇文章主要給大家介紹了關(guān)于VSCode中Python環(huán)境配置、創(chuàng)建虛擬環(huán)境及pip的一些常用命令,Python環(huán)境的創(chuàng)建是在VSCode中很常見的一個需求,特別是當我們需要開發(fā)或者調(diào)試多個Python項目時,使用虛擬環(huán)境是一種好的方式,需要的朋友可以參考下2023-10-10
使用apidoc管理RESTful風(fēng)格Flask項目接口文檔方法
下面小編就為大家分享一篇使用apidoc管理RESTful風(fēng)格Flask項目接口文檔方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
Python中循環(huán)引用(import)失敗的解決方法
在python中常常會遇到循環(huán)import即circular import的問題,下面這篇文章主要給大家介紹了關(guān)于Python中循環(huán)引用(import)失敗的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
jupyter?notebook?中使用ipython?魔法指令的詳細過程
在?Jupyter?Notebook?中,IPython?魔法指令為數(shù)據(jù)分析和探索提供了很多便利,這篇文章主要介紹了jupyter?notebook?中使用ipython?魔法指令的詳細過程,需要的朋友可以參考下2024-06-06

