一個(gè)保存微信文章的小工具

最近參考一些技術(shù)文章同時(shí)結(jié)合自己的思考用Python寫了個(gè)可以批量保存微信文章的小工具。實(shí)現(xiàn)的功能是通過微信文章的鏈接將文章保存為圖片、HTML以及PDF,使用方法很簡單,不懂技術(shù)也能用。

寫這個(gè)小工具源于我的一個(gè)習(xí)慣,在看到喜歡或者有啟發(fā)的微信文章時(shí),除了在微信收藏,我還會(huì)把它們保存下來。

一般手動(dòng)操作的步驟,首先是把某篇公眾號(hào)文章的鏈接放到谷歌瀏覽器的地址欄來打開文章,然后使用谷歌瀏覽器的打印功能將文章保存為PDF,按F12調(diào)出調(diào)試窗口后再按ctrl+shift+p調(diào)出命令輸入框接著輸入Capture full size screenshot按回車后保存為圖片。


Chrome手動(dòng)截圖

一篇兩篇文章這樣操作還沒什么,一旦想要保存的文章多了我就得一遍又一遍地重復(fù)上面的操作,這無疑是非常繁瑣的。為了提高效率,我把這些步驟寫成腳本,用Python來自動(dòng)幫我完成,于是就有了這個(gè)工具。

只需要將公眾號(hào)文章的鏈接放入到某個(gè)特定的txt文件,然后運(yùn)行工具就可以批量地將微信文章保存為圖片、HTML以及PDF。比之前的手動(dòng)步驟方便多了。

下面的內(nèi)容主要分為兩部分,第一部分「使用指南」是講如何使用這個(gè)工具的,第二部分「開發(fā)者指南」是講這個(gè)工具的開發(fā)思路和代碼邏輯,如果對(duì)代碼不感興趣直接略過第二部分就好。工具的使用和開發(fā)都是基于Win10系統(tǒng)的。

使用指南

1.獲取相關(guān)文件

關(guān)注公眾號(hào)「雙城筆錄」后發(fā)送文字「Python」獲取網(wǎng)盤鏈接及提取碼,通過鏈接下載相關(guān)壓縮包

2.解壓文件

將壓縮包解壓獲得saveArticle文件夾,將該文件夾放到?jīng)]有中文的路徑下,里面的文件如下:


文件

如果壓縮包中的谷歌瀏覽器、Chromedriver和wkhtmltopdf與你的系統(tǒng)不兼容,可以到下面的網(wǎng)址去下載適合的版本,將下載的包放在與exe文件相同的文件夾。其中谷歌瀏覽器、Chromedriver的版本要一致。

3.安裝谷歌瀏覽器和wkhtmltopdf

  • 點(diǎn)擊ChromeStandaloneSetup64.exe,在彈出的窗口點(diǎn)擊“是”,等待安裝完成即可。


    安裝谷歌瀏覽器
  • 點(diǎn)擊wkhtmltox-0.12.5-1.msvc2015-win64.exe,在彈出的窗口點(diǎn)擊“是”,進(jìn)入到下一步后點(diǎn)擊“I Agree”,然后點(diǎn)擊install將其安裝在默認(rèn)文件夾C:\Program Files\wkhtmltopdf,等待安裝完成即可。


    安裝wkhtmltopdf

4.填入公眾號(hào)文章鏈接

在urls4.txt填寫你需要保存的公眾號(hào)文章的鏈接,注意一行只能寫一條鏈接,注意不要有空格及其他特殊字符(urls4.txt中默認(rèn)鏈接有兩條微信文章的鏈接,第一次使用時(shí)可以先試下效果)

urls4.txt

5.運(yùn)行工具

按照實(shí)際需要點(diǎn)擊exe文件,其中三個(gè)exe的功能略有差別,請(qǐng)酌情選擇,差別如下:

  • saveAricleToPIC.exe僅對(duì)文章進(jìn)行截圖
  • saveArticleToPIC_HTML.exe 對(duì)文章截圖并保存為HTML(因?yàn)楸4鏋镻DF耗時(shí)會(huì)比較長,所以通常我會(huì)選擇這種,既可以保留文章的格式又可以節(jié)約時(shí)間)
  • saveArticleToPIC_HTML_PDF.exe 對(duì)公眾號(hào)文章截圖、保存為HTML以及PDF

注意要在saveArticle文件夾中運(yùn)行exe文件。

6.完成標(biāo)志

命令提示符框顯示"本次保存所有文章的總耗時(shí)為xx秒字樣"時(shí),表示已經(jīng)完成本次操作


完成標(biāo)志

開發(fā)指南

1.開發(fā)環(huán)境部署

使用的編程語言版本、瀏覽器版本、Chromedriver版本以及wkhtmltopdf版本

  • Python 3.6.8
  • 谷歌瀏覽器 79.0.3945.88版
  • Chromedriver 79.0.3945.88版
  • wkhtmltopdf wkhtmltox-0.12.5-1.msvc2015-win64

安裝Python的教程網(wǎng)上有很多這里就不贅述了,Chromedriver不需要安裝,谷歌瀏覽器和wkhtmltopdf的安裝包及安裝步驟在上面「使用指南」已經(jīng)提及。

2.使用到的Python模塊

selenium,os,requests,time,pdfkit,re,BeautifulSoup,html5lib,pyinstaller.
其中os,time及re為Python標(biāo)準(zhǔn)庫無需另外安裝,selenium,requests,pdfkit,BeautifulSoup,html5lib以及pyinstaller可以用pip命令安裝。
比如安裝pyinstaller,在cmd窗口輸入pip install pyinstaller然后點(diǎn)擊回車等待安裝完成即可。


安裝pyinstaller

下面講講開發(fā)的思路和比較關(guān)鍵的代碼。

3. 思路

使用Chromedriver和selenium模擬瀏覽器來訪問微信文章并進(jìn)行全屏截圖。

使用BeautifulSoup,用它的find方法和tag屬性修改刪除來解決微信文章圖片懶加載(即當(dāng)查看到文章某部分時(shí)圖片才加載)的問題,用find方法提取文章的作者和標(biāo)題,同時(shí)將BeautifulSoup提取的HTML保存為HTML文件。

使用pdfkit調(diào)用wkhtmltopdf將保存的HTML轉(zhuǎn)換為PDF文件。

4.關(guān)鍵代碼

1)引入selenium和chromedriver,先設(shè)置好相關(guān)配置,將chrome設(shè)置為無界面模式同時(shí)屏蔽掉chromedriver運(yùn)行日志。在開發(fā)過程中如果不屏蔽掉運(yùn)行日志,那么將會(huì)有很多冗余的信息干擾你的視線。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
os.environ['webdriver.chrome.driver'] = chromedriver
# 設(shè)置chrome開啟的模式,headless就是無界面模式,只有開啟這個(gè)模式才能截取全屏
chrome_options = Options()
chrome_options.add_argument('headless')
# 屏蔽chromedriver運(yùn)行日志
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(chromedriver, chrome_options=chrome_options)

2)因?yàn)槲⑿盼恼率褂玫氖菓屑虞d圖片的方式,所以如果直接使用save_screenshot方法只能截取到文字內(nèi)容而無法截取文章里的圖片,所以要用selenium的webdirver來執(zhí)行JS腳本,模擬拖動(dòng)滾動(dòng)條到頁面的最底部。

all_window_height = []
# 當(dāng)前頁面的最大高度加入列表
all_window_height.append(driver.execute_script('return document.body.scrollHeight;')) 
while True:
    # 執(zhí)行拖動(dòng)滾動(dòng)條操作
    driver.execute_script('scroll(0,100000)')
    time.sleep(3)
    check_height = driver.execute_script('return document.body.scrollHeight;')
    # 判斷拖動(dòng)滾動(dòng)條后的最大高度與上一次的最大高度的大小,相等表明到了最底部
    if check_height == all_window_height[-1]:
        break
    else:
        # 如果不相等,將當(dāng)前頁面最大高度加入列
        all_window_height.append(check_height)

本段代碼參考自
https://blog.csdn.net/weixin_40718824/article/details/84196233

3)用selenium的webdirver來執(zhí)行JS腳本,從而獲得整個(gè)網(wǎng)頁的高度和寬度,然后使用save_screenshot對(duì)整篇文章進(jìn)行截圖

width = driver.execute_script('return document.documentElement.scrollWidth')
height = driver.execute_script('return document.documentElement.scrollHeight')
# 將瀏覽器的寬高設(shè)置成剛剛獲取的寬高
driver.set_window_size(width, height)
driver.save_screenshot(pic_path)

4)和上面截圖時(shí)遇到的圖片懶加載一樣,如果用BeautifulSoup直接將微信文章保存為HTML的話,保存的文件中是看不到圖片的,只能看到一個(gè)個(gè)loading。請(qǐng)教前端同事后,發(fā)現(xiàn)只要先將微信文章HTML中的屬性data-src改為src,然后再保存為HTML文件就不會(huì)有這個(gè)問題了

soup = BeautifulSoup(response.content, 'html5lib')
# 將擁有'data-src'屬性的圖片標(biāo)簽的'data-src'改為'src',解決JS懶加載的問題
for img in soup.find_all('img', {'data-src': True}):
    img['src'] = img['data-src']
    del img['data-src']

5)通過pdfkit調(diào)用wkhtmltopdf模塊

pdfkit.from_file(html_path, pdf_path, options=options, configuration=config)

6)完成代碼開發(fā)后,使用pyinstaller -F saveArticleToPIC_HTML_PDF.py將代碼和使用到的Python模塊打包成exe,這樣在沒有Python環(huán)境的電腦也可以使用這個(gè)工具了。


pyinstaller.png

完整工具包請(qǐng)關(guān)注公眾號(hào)「雙城筆錄」回復(fù)關(guān)鍵字「Python」可以獲取下載鏈接。

參考資料


題圖:Photo by Python官網(wǎng)和微信官網(wǎng)

Note:
1.因?yàn)樗接邢?,寫的這個(gè)小工具也只是能用而已,如果讀者朋友們發(fā)現(xiàn)功能或者代碼有不合理的地方,歡迎后臺(tái)留言指正交流,不勝感激。
2.一些網(wǎng)頁也可以用這個(gè)工具來保存,使用方法也是一樣的,讀者們可以試一試。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容