在線工具:微信文章轉(zhuǎn)PDF
2018.2.13
相信在你所關(guān)注的微信公眾號(hào)中扳缕,總會(huì)有一些作者在持續(xù)地輸出優(yōu)質(zhì)內(nèi)容锥腻≈龊或許這些內(nèi)容是你所處領(lǐng)域的精華干貨蓉驹,或許文章內(nèi)的語句令人賞心悅目,以至于時(shí)不時(shí)你的腦中冒出這么一個(gè)想法:我要將此微信公眾號(hào)所有的文章都保存下來搂橙。
但當(dāng)看到眾多的歷史文章時(shí)歉提,想到要一篇一篇地查看然后另存為PDF,會(huì)立即讓人望而生畏区转。
So苔巨,本文為你提供一個(gè)較為極客的解決方案。
明確目的
快速地將某一微信公眾號(hào)發(fā)布的所有歷史文章都保存在一個(gè)PDF文件中废离。
了解筆者編寫程序的邏輯
在下文中侄泽,筆者將通過Python語言編寫代碼,來實(shí)現(xiàn)將微信公眾號(hào)所有歷史文章保存下來的功能蜻韭。
在這里需要先搞明白程序的邏輯:
- 獲取某一微信公眾號(hào)所有歷史文章的url鏈接
- 編寫可重復(fù)調(diào)用的函數(shù)悼尾,達(dá)到輸入文章url鏈接,輸出文章正文HTML內(nèi)容的功能
- 通過循環(huán)語句湘捎,將第一步獲取到的所有url都調(diào)用第二步的函數(shù)
- 將以上所有輸出的正文內(nèi)容拼接為一個(gè)HTML文件
- 通過Chrome瀏覽器將HTML轉(zhuǎn)為PDF文件即可
程序的具體實(shí)現(xiàn)步驟
1. 通過Fiddler抓包獲取查看歷史文章的url鏈接
微信設(shè)置了限制诀豁,使得正常的瀏覽器不能打開微信查看歷史文章的url鏈接窄刘。如下圖所示窥妇,會(huì)顯示請(qǐng)?jiān)谖⑿趴蛻舳舜蜷_鏈接的字樣:
此時(shí)便需要借助網(wǎng)絡(luò)抓包工具Fiddler來獲取真正可在瀏覽器中打開的url。另外還需登錄電腦端微信娩践。
當(dāng)用電腦端微信查看某一公眾號(hào)歷史消息時(shí)活翩,F(xiàn)iddler會(huì)記錄到請(qǐng)求的https鏈接地址烹骨,復(fù)制此url在正常瀏覽器中打開即可。
如下圖所示材泄,此時(shí)便可通過正常瀏覽器查看某一公眾號(hào)所有歷史消息記錄沮焕。
2. 從上述網(wǎng)頁中提取所有文章的url鏈接
此時(shí)需注意,上圖的網(wǎng)頁只會(huì)緩存前幾篇文章拉宗,你需要做的峦树,就是不斷將網(wǎng)頁滾動(dòng)條下拉至最底端,讓所有歷史文章緩存在此網(wǎng)頁中旦事。
接下來通過右鍵審查元素魁巩,復(fù)制并保存包含所有歷史文章url的HTML源代碼。
最后通過BeautifulSoup或者正則表達(dá)式提取出所有的正文鏈接姐浮,保存在數(shù)組中谷遂。
下面代碼用正則表達(dá)式來提取所有歷史文章的url鏈接:
# 引入正則庫
import re
# 1.html為包含所有歷史文章url的HTML源碼文件
f = open('1.html','r')
c = f.read()
f.close()
# 正則表達(dá)式,提取所有符合正文格式的鏈接
links_b = re.findall('hrefs="(http://mp.weixin.qq.com.+?)"',c,re.S)
# 最終所有的url鏈接將會(huì)保存在數(shù)組links中
links = []
for i in links_b:
# 保證數(shù)組正文鏈接不重復(fù)
if i not in links:
links.append(i)
3. 循環(huán)語句合并且保存所有文章正文內(nèi)容為HTML文件
首先我寫了一個(gè)爬蟲的類卖鲤,創(chuàng)建對(duì)象時(shí)輸入url便可:
import requests,re
from bs4 import BeautifulSoup
class Spider:
'網(wǎng)絡(luò)爬蟲'
def __init__(self,url):
self.url = url
self.content = self.getContent()
self.bs = self.toBs()
def getContent(self):
r = requests.get(self.url)
c = r.content
return c
def toBs(self):
b = BeautifulSoup(self.content,'lxml')
return b
def getGoalContent(self,tag,id,attr):
g = self.bs.find(tag,{id:attr})
return g
通過分析微信公眾號(hào)的HTML代碼肾扰,只需下面二行代碼,便可獲得返回文章正文內(nèi)容(配合上面class
使用):
# 對(duì)象實(shí)例化
weixin = Spider(links[0])
# 調(diào)用類中的getGoalContent方法
content = str(weixin.getGoalContent('div','id','img-content'))
剩下的便是循環(huán)和保存為HTML文件的代碼(以下代碼有所刪減蛋逾,但不影響主要功能):
# 最終所有歷史文章正文合并后的HTML代碼將保存在strs中
strs = ''
# 循環(huán)調(diào)用
for i in range(len(links)):
weixin = Spider(links[i])
content = str(weixin.getGoalContent('div','id','img-content'))
strs += content
# 保存為同一目錄中的out.html文件
f = open('out.html','w')
f.write(strs)
f.close()
4. 將HTML轉(zhuǎn)換為PDF
將以上代碼保存為main.py
文件集晚,然后在終端運(yùn)行,便會(huì)在同一目錄生成out.html
文件区匣。
用Chrome瀏覽器將out.html
文件打開甩恼,右鍵打印,選擇導(dǎo)出PDF即可沉颂。
以下是生成的PDF文件示例截圖:
后記
- 程序的邏輯部分較為重要条摸,具體的代碼方面上文有所刪減
- 抓取到正文中的圖片還需經(jīng)過一定的程序處理才能顯示
- Fiddler抓包工具筆者也是剛上手,所以本文中沒能詳細(xì)介紹