摘要:文章首發自我的個人網站前言學也有一段時間了網上也有不少官方文檔的中文翻譯版但是似乎只有中文網站文檔一直是最新的奈何并沒有供直接下載是在是不太方便為了方便閱讀以及方便后續文檔更新決定用寫一個爬蟲將網頁下載下來保持為最后完成結果如下是的沒錯
文章首發自我的 個人網站-Leetao"s Blog前言
學 Rust 也有一段時間了,網上也有不少官方文檔的中文翻譯版,但是似乎只有 [Rust中文網站](
https://rustlang-cn.org) 文檔一直是最新的,奈何并沒有 PDF 供直接下載,是在是不太方便,為了方便閱讀以及方便后續文檔更新,決定用 Python 寫一個爬蟲將網頁下載下來保持為 PDF. 最后完成結果如下:
是的沒錯,將官網樣式也保留下來成功轉為 PDF,接下來分享一下整個爬蟲的過程,最終的爬蟲可以導出任意 VuePress 搭建的網站為 PDF.
爬蟲 依賴庫的選定requests
BeautifulSoup4
pdfkit
關于 requests 和 BeautifulSoup4 庫這里就不做介紹了, 寫過爬蟲的基本上都接觸過, 重點說一下 pdfkit 庫, 毫無疑問,它就是導出 PDF 的關鍵,簡單說一下它的用法
PdfKitPdfKit 庫是對 Wkhtmltopdf 工具包的封裝類,所以在使用之前,需要去官網下載相應的安裝包安裝到電腦上, [下載地址](
https://wkhtmltopdf.org/downl...
可選: 安裝完成之后可以 Windows 下可以將安裝路徑添加到系統環境變量中
安裝完成之后,說一下 PdfKit 的常用方法,常用方法有三個
from_urldef from_url(url, output_path, options=None, toc=None, cover=None, configuration=None, cover_first=False): """ Convert file of files from URLs to PDF document :param url: URL or list of URLs to be saved :param output_path: path to output PDF file. False means file will be returned as string. :param options: (optional) dict with wkhtmltopdf global and page options, with or w/o "--" :param toc: (optional) dict with toc-specific wkhtmltopdf options, with or w/o "--" :param cover: (optional) string with url/filename with a cover html page :param configuration: (optional) instance of pdfkit.configuration.Configuration() :param configuration_first: (optional) if True, cover always precedes TOC Returns: True on success """ r = PDFKit(url, "url", options=options, toc=toc, cover=cover, configuration=configuration, cover_first=cover_first) return r.to_pdf(output_path)
從函數名上就很容易理解這個函數的作用,沒錯就是根據 url 下載網頁為 PDF
from_file()def from_file(input, output_path, options=None, toc=None, cover=None, css=None, configuration=None, cover_first=False): """ Convert HTML file or files to PDF document :param input: path to HTML file or list with paths or file-like object :param output_path: path to output PDF file. False means file will be returned as string. :param options: (optional) dict with wkhtmltopdf options, with or w/o "--" :param toc: (optional) dict with toc-specific wkhtmltopdf options, with or w/o "--" :param cover: (optional) string with url/filename with a cover html page :param css: (optional) string with path to css file which will be added to a single input file :param configuration: (optional) instance of pdfkit.configuration.Configuration() :param configuration_first: (optional) if True, cover always precedes TOC Returns: True on success """ r = PDFKit(input, "file", options=options, toc=toc, cover=cover, css=css, configuration=configuration, cover_first=cover_first) return r.to_pdf(output_path)
這個則是從文件中生成 PDF, 也是我最后選擇的方案,至于為什么沒有選擇 from_url(),稍后等我分析完,就會明白了.
from_stringdef from_string(input, output_path, options=None, toc=None, cover=None, css=None, configuration=None, cover_first=False): """ Convert given string or strings to PDF document :param input: string with a desired text. Could be a raw text or a html file :param output_path: path to output PDF file. False means file will be returned as string. :param options: (optional) dict with wkhtmltopdf options, with or w/o "--" :param toc: (optional) dict with toc-specific wkhtmltopdf options, with or w/o "--" :param cover: (optional) string with url/filename with a cover html page :param css: (optional) string with path to css file which will be added to a input string :param configuration: (optional) instance of pdfkit.configuration.Configuration() :param configuration_first: (optional) if True, cover always precedes TOC Returns: True on success """ r = PDFKit(input, "string", options=options, toc=toc, cover=cover, css=css, configuration=configuration, cover_first=cover_first) return r.to_pdf(output_path)
這個方法則是從字符串中生成 PDF,很明顯沒有辦法保持網頁樣式,所以不考慮.關于更多 PdfKit 的用法,可以去 [wkhtmltopdf文檔](
https://wkhtmltopdf.org/usage... 查看
依賴庫選定完畢,接下來就是分析目標網頁,開始寫爬蟲的過程了.
測試 PdfKitPdfKit 自帶一個 from_url 生成 PDF 的功能,如果可以生成合適的 PDF,那我們只需要獲取所有網頁鏈接就可以了,可以節省很多時間,先測試一下生成的效果
import pdfkit pdfkit.from_url("https://rustlang-cn.org/office/rust/book/", "out.pdf", configuration=pdfkit.configuration( wkhtmltopdf="path/to/wkhtmltopdf.exe"))
導出結果如下:
從結果不難看出,網頁的樣式保存下來了,但是側邊欄,頂部和底邊導航欄也都被保留下來了,并且側邊欄還擋住了主要內容,所以使用 from_url 這個方法就被排除了.
最終方案通過測試,我們得知不能使用 from_url 那么只能通過使用 from_file 去導出了, 并且在我們將網頁下載下來保存到本地之前,我們需要修改網頁內容,移除頂部導航欄,側邊欄,以及底部導航欄
獲取相應元素現在讓我們先獲取頁面下一頁鏈接,打開瀏覽器調試模式,審查一下網頁元素,不難發現所有下一頁導航,都處于 之下的超鏈接 中,如下圖:
通過同樣的方法,不難發現頂部導航欄,側邊欄,以及底部導航欄對應的元素,依次為 ,,, 找到對應的元素接著就是獲取鏈接和銷毀不必要元素
class DownloadVuePress2Pdf: def get_content_and_next_url(self, content): # content 為網頁內容 # 獲取鏈接和銷毀不必要元素 navbar = soup.select(".navbar") if len(navbar): navbar[0].decompose() sidebar = soup.select(".sidebar") if len(sidebar): sidebar[0].decompose() page_edit = soup.select(".page-edit") if len(page_edit): page_edit[0].decompose() # 注意下一頁鏈接在底部導航欄元素中, # 要先獲取鏈接后,才能銷毀元素,順序不能顛倒 next_span = soup.select(".next") if len(next_span): next_span_href = next_span[0].a["href"] else: next_span_href = None page_nav = soup.select(".page-nav") if len(page_nav): page_nav[0].decompose()保持導出 PDF 樣式
為了使得導出 PDF 的樣式和網頁一致,我們有倆種方法:
根據源碼在對應目錄建立本地 css 文件,顯然這種方法不具有普遍性,不能每導出一個網站,我們就新建一個 css 文件
既然本地的不行,那我們就將網頁中的 css 鏈接 href 地址指向遠程 css
在上述代碼中添加如下代碼:
for link in links: if not link["href"].startswith("http"): link["href"] = css_domain + link["href"] # css_domain 為 css 默認域名,需要設置,獲取方式可見下圖導出
通過上述的方式,我們將網頁下載下來保存到本地,全部下載完成之后,最后就是導出為 PDF 了,通過 from_file() 方法很容易完成導出這個操作
pdfkit.from_file([文件列表], "導出的文件名稱.pdf", options=options, configuration=config)
至此導出 Rust 官網文檔為 PDF 的過程全部完成,效果如開頭展示的那樣
注意: 由于 VuePress 搭建的網站基本上布局格式一樣, 所以上面的代碼同樣可以用來導出其他由 VuePress 構建的網站
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43764.html
摘要:五一之前就想寫一篇關于的文章結果朋友結婚就不了了之了。記得最后一定要看注意事項更新倉庫介紹官網類似一個極簡的靜態網站生成器用來寫技術文檔不能在爽。當然搭建成博客也不成問題。構建與自動部署用的或者的都可以也可以搭建在自己的服務器上。 五一之前就想寫一篇關于Vuepress的文章,結果朋友結婚就不了了之了。記得最后一定要看注意事項! 更新:coding倉庫:https://git.dev...
前言 從 9 月份開始,vuepress 源碼進行了重新設計和拆分。先是開了個 next 分支,后來又合并到 master 分支,為即將發布的 1.x 版本做準備。 最主要的變化是:大部分的全局功能都被拆分成了插件的形式,以可插拔的方式來支撐 vuepress 的運作,這一點很像 webpack。 具體架構如下: showImg(https://user-gold-cdn.xitu.io/2019...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
閱讀 1626·2021-10-25 09:46
閱讀 3209·2021-10-08 10:04
閱讀 2354·2021-09-06 15:00
閱讀 2768·2021-08-19 10:57
閱讀 2077·2019-08-30 11:03
閱讀 970·2019-08-30 11:00
閱讀 2370·2019-08-26 17:10
閱讀 3545·2019-08-26 13:36