如何用 Python 爬取網頁製作電子書

2020-12-25 騰訊網

關鍵時刻,第一時間送達!

作者簡介:孫亖,軟體工程師,長期從事企業信息化系統的研發工作,主要擅長後臺業務功能的設計開發。

本文來自作者在 GitChat 上分享「如何用 Python 爬取網頁製作電子書」主題內容。

有人爬取數據分析黃金周旅遊景點,有人爬取數據分析相親,有人大數據分析雙十一,連小學生寫論文都用上了大數據。

我們每個人每天都在往網上通過微信、微博、淘寶等上傳我們的個人信息,現在就連我們的錢都是放在網上,以後到強人工智慧,我們連決策都要依靠網絡。網上的數據就是資源和寶藏,我們需要一把鏟子來挖掘它。

最近,AI 的興起讓 Python 火了一把。實際上 Python 擁有龐大的第三方支持,生態系統非常完整,可以適用各種場景和行業。

這次,我們準備通過 Python 學習爬蟲的開發,既簡單有趣,而且是數據採集重要一環。同時脫離應用談技術就是耍流氓,通過製作電子書學習數據的收集與整理,即能學到東西又有實用價值。

我們將通過爬取網頁信息這個很小的應用場景來體會數據預處理的思想,並從中學習了解數據處理中抓取、處理、分組、存儲等過程的實現。

我這次分享主要分為以下幾個部分:

Python 語法:通過分享掌握簡單的 Python 開發語法和思路,側重於後面爬蟲開發的需要用的內容;

Scrapy 爬蟲開發:通過分享了解基本的 Scrapy 開發,並實現從網絡爬取數據,使用 Sigil 製作 epub 電子書;

最後,我希望通過分享,讓更多人能夠入門並喜歡上 Python 開發,掌握 Scrapy 爬蟲開發的思路和方法。

一、Python 開發

1.1 Windows 下環境安裝

熟悉 Windows 的安裝 Python 不難,首先官網下載:https://www.python.org/downloads/。

有兩個版本,根據需要選擇自己的版本,現在越來越多的庫開始支持 3,所以建議下載 3,這裡我們以 2 為例。

雙擊下載的安裝文件,一路 Next 即可,但是要注意勾選 __pip__ 和 Add python.exe to Path:

pip 是 Python 生態體系裡面的包管理工具,很多第三方庫可以通過它方便的管理。

安裝 Finish 之後,打開命令行窗口,輸入 Python:

如果出現這個界面說明安裝成功了,如果出現下面的情況:

『python』 不是內部或外部命令,也不是可運行的程序或批處理文件。

需要把 python.exe 的目錄添加到 path 中,一般是 C:/Python27。

1.2 Python 之 HelloWorld

目前我所接觸過的所有程式語言都只要掌握三個內容就可以了:就是輸入、處理、輸出。我們已經安裝好了 Python,可以來一個最俗套的程序。

首先我們打開 windows 的控制臺,然後輸入 python 回車,然後輸入如下代碼:

我就問你俗不俗,好了,看結果:

根據我上面的說法,這個程序的輸入就是 Hello World 字符串,處理使系統內部的輸出處理,輸出結果就是 『Hello World』。

我們還可以把代碼寫在文件裡面:

執行效果:

我們說這個不是單純的秀一下,以前沒有用戶界面的時候 print 可以作為人機互動用途,現在多數是用於調試,可以在程序運行的時候快速的輸出程序結果或者過程結果。

1.3 做菜與編程

現在有個很有意思的說法:生數據(原始數據)就是沒有處理過的數據,熟數據(Cooked Data)是指原始數據經過加工處理後的數據,處理包括解壓縮、組織,或者是分析和提出,以備將來使用。

這就像做菜生菜是輸入,菜譜是程序,洗、切、烹飪等處理是程序執行過程,最後輸出的熟菜。但不管生菜、熟菜都是菜,或者都是物質。

準備食材

在程序世界裡的物質組成就是數據,就像有蘿蔔白菜等不同的品種一樣,數據也有不同的類型。我目前所接觸到的數據類型主要有以下幾種:

物理類:數據在物理內存中的表達存儲方式;

字節

數據類:數據類中的具體類型代表了不同精度和內存中不同的存儲結構;

整數

浮點數

長整型

雙精度

字符類:就是文本字符相關的數據類型;

字符

字符串

邏輯類:就是邏輯真與邏輯假;

布爾值

複合類:由各基本的數據類型按照一定的結構組合而成的數據;

結構體

集合

字典

列表

序列

Hash 表

……

這裡我強調幾點:

首先,這個分類不是某種語言特有,目前大多數程式語言都差不多,你理解這個思想就把自己的編程能力擴展了。

其次,它不需要專門記憶,編程是程序性的知識,運用的知識,是一種技能,你要做什麼菜,你來這個分類查查需要什麼原材料,再去具體研究,慢慢就會了,不做你記住了也沒用。

用多深,研究多深,不用就別研究浪費時間。比如說,我們一般性應用不會去考慮數據的內存模型,但是涉及到精度、性能或者邊界值時我們就需要小心,研究得深一些。

器皿

食材已準備好了,可以下鍋,可鍋在哪裡,你不能放在手裡加工。程序裡我們用變量、常量來盛各種數據,還有個作用域的問題,嚴格的廚房紅案和白案是分開的,有時候砧板是不能互用的。

空值:四大皆空,什麼也不是,不是 0,不是長度為 0 的字符串,不是 false,什麼都不是;

變量:學過數學的人都應該有這個概念,反正差不多;

常量:固定不變的量,比如說 π。

烹飪手法

剛查了下,我大天朝常用的烹飪手法多達 20 多種,我歸納了一下,編程大概就那麼幾種:

數值計算——加減乘除、位移等;

邏輯計算——邏輯真假判斷;

過程計算——循環、嵌套、遞歸等;

數據處理——字符串、對象的操作。

菜譜與炒菜

菜都準備好了,下鍋怎麼炒,全靠菜譜,它就是程序,而我們按照菜譜炒菜這個過程就是程序的執行。

Python 或任何一種程式語言都是博大精深,同時又是一種技能,不可能在使用之前完全掌握,也沒必要。

我們需要知道的是我們想吃什麼(程序要輸出什麼),然後再去菜市場買時才找菜譜(搜尋引擎查資料),最後按照我們的需求加工(編程)。

1.4 Python 簡單實踐

首先我們來寫三個 Python 文件:

hello.py

——事情的處理有落點,程序執行有入口,例如:main,這個文件可以看作程序的入口。

pkg.py

——程序可以分塊編寫,這樣層次更分明,易於理解和維護,我們在 pkg.py 中編寫一部分功能,作為演示模塊。

init.py

——這是一個空文件,也可以寫代碼,表明當前路徑是包。

接下來,我們來運行一下:

顯示結果如下:

我們運行了 hello.py 文件,然後 hello.py 導入了包 pkg;包 pkg 定義了一個方法和一個類,我們在 hello.py 文件裡面調用了外部的方法和類。

二、使用 Scrapy 抓取電子書

2.1 寫在爬取數據之前

雖然我們這裡的數據都是從公開的網絡獲取,但也不能確定其版權問題,因此獲取的數據僅用於編程練習,嚴禁分享或用於其他用途。

好了,現在我們找一個在線看書的網站,找一本書把它下載到本地。首先,我們準備下載工具,就是 Python 的爬蟲框架 Scrapy。

2.2 Scrapy 安裝

安裝完 Python 後可以用以下的命令按照 Scrapy,有些版本的 Python 沒有帶 pip 需要手動安裝。

pip 是 Python 的包管理器,大量的第三方包或者說功能可以通過這個工具來管理,所謂包就是模塊化的功能集合,基本的技術參考實踐裡面的包。

我安裝成功顯示如下信息:

2.3 新建 Scrapy 爬蟲項目

Scrapy 是 Python 程序,同時也是一套框架,提供了一系列工具來簡化開發,因此我們按照 Scrapy 的模式來開發,先新建一個 Scrapy 項目,如下:

Scrapy 項目包含一些基礎框架代碼,我們在此基礎上開發,目錄結構類似下圖:

2.4 新建 Scrapy 爬蟲

這時,Scrapy 還不知道我們要爬取什麼數據,所以我們要用 Scrapy 工具新建一個爬蟲,命令如下:

下面實操,我們在起點中文網找一篇免費小說的完本,這裡選擇是《修真小主播》。

我們就在前面建立的 Scrapy 項目 ebook 下新建一個爬蟲,命令如下:

執行成功之後,在項目的 spider 目錄下就多了一個 xzxzb.py 的文件。

2.5 爬蟲思路

怎麼抓取數據,首先我們要看從哪裡取,打開《修真小主播》的頁面,如下:

有個目錄頁籤,點擊這個頁籤可以看見目錄,使用瀏覽器的元素查看工具,我們可以定位到目錄和每一章節的相關信息,根據這些信息我們就可以爬取到具體的頁面:

2.6 獲取章節地址

現在我們打開 xzxzb.py 文件,就是我們剛剛創建的爬蟲:

start_urls 就是目錄地址,爬蟲會自動爬這個地址,然後結果就在下面的 parse 中處理。現在我們就來編寫代碼處理目錄數據,首先爬取小說的主頁,獲取目錄列表:

獲取網頁中的 DOM 數據有兩種方式,一種是使用 CSS 選擇子,另外一種是使用 XML 的 xPath 查詢。

這裡我們用 xPath,相關知識請自行學習,看以上代碼,首先我們通過 ID 獲取目錄框,獲取類 cf 獲取目錄列表:

接著,遍歷子節點,並查詢 li 標籤內 a 子節點的 href 屬性,最後列印出來:

這樣,可以說爬取章節路徑的小爬蟲就寫好了,使用如下命令運行 xzxzb 爬蟲查看結果:

這個時候我們的程序可能會出現如下錯誤:

運行下面的語句即可:

屏幕輸出如下:

爬取章節路徑的小爬蟲就寫好了,但我們的目的不僅於此,我們接下來使用這些地址來抓取內容:

2.7 章節頁面分析

我們接下來分析一下章節頁面,從章節頁面我們要獲取標題和內容。

如果說章節信息爬取使用的 parser 方法,那麼我們可以給每一個章節內容的爬取寫一個方法,比如:parser_chapter,先看看章節頁面的具體情況:

可以看到,章節的整個內容在類名為 main-text-wrap 的 div 標籤內,標題是其中類名為j_chapterName的 h3 標籤,具體內容是類名為read-content j_readContent的 div 標籤。

試著把這些內容列印出來:

上一步,我們獲取到了一個章節地址,從輸出內容來看是相對路徑,因此我們使用了yield response.follow(url, callback=self.parse_chapter),第二個參數是一個回調函數,用來處理章節頁面,爬取到章節頁面後我們解析頁面和標題保存到文件。

scrapy.Request 不同於使用 response.follow,需要通過相對路徑構造出絕對路徑,response.follow 可以直接使用相對路徑,因此就不需要調用 urljoin 方法了。

注意,response.follow 直接返回一個 Request 實例,可以直接通過 yield 進行返回。

數據獲取了之後是存儲,由於我們要的是 html 頁面,因此,我們就按標題存儲即可,代碼如下:

至此,我們已經成功的抓取到了我們的數據,但還不能直接使用,需要整理和優化。

2.8 數據整理

首先,我們爬取下來的章節頁面排序不是很好,如果人工去排需要太多的時間精力;另外,章節內容包含許多額外的東西,閱讀體驗不好,我們需要優化內容的排版和可讀性。

我們先給章節排個序,因為目錄中的章節列表是按順序排列的,所以只需要給下載頁面名稱添加一個順序號就行了。

可是保存網頁的代碼是回調函數,順序只是在處理目錄的時候能確定,回調函數怎麼能知道順序呢?因此,我們要告訴回調函數它處理章節的順序號,我們要給回調函數傳參,修改後的代碼是這樣的:

不知道大家注意到沒有,前面的分析中目錄已經提供了一個data_rid可以作為排序號,我們在目錄分析頁面獲取這個序號,然後通過 request 的 meta 傳入parse_chapter。

在parse_chapter中通過 response 的 meta 獲取傳入的參數,然後文件名中加入這個順序好完成了排序。另外,Sigil 找那個通過 H1 標籤來生成目錄,需要目錄的話,我們需要給內容添加一個 h1 標籤。

還有可讀性差的問題,也許我們下載的網頁可能會包含一些亂七八糟的東西,我們有很多辦法,也可以使用 readbility 等第三方庫,這裡就不深入了。

三、使用 Sigil 製作電子書

電子書的製作,完全就是工具的應用,非常簡單,這裡把流程過一下,大家根據興趣自行深入。

3.1 Sigil 簡介

Sigil 是一個多平臺的 ePub 電子書編輯器。官方網站:https://sigil-ebook.com/,下載頁面在 https://github.com/Sigil-Ebook/Sigil/releases,根據自己的需求下載,安裝很簡單就不囉嗦了。

3.2 ePub 電子書簡介

ePub(Electronic Publication 的縮寫,意為:電子出版),是一個自由的開放標準,屬於一種可以 「自動重新編排」 的內容;也就是文字內容可以根據閱讀設備的特性,以最適於閱讀的方式顯示。

ePub 檔案內部使用了 XHTML 或 DTBook (一種由 DAISY Consortium 提出的 XML 標準)來展現文字、並以 zip 壓縮格式來包裹檔案內容。EPub 格式中包含了數位版權管理(DRM)相關功能可供選用。

3.3 加載 html 文件

要製作 ePub 電子書,我們首先通過 Sigil 把我們的抓取的文件加載到程序中,在添加文件對話框中我們全選所有文件:

內容都是 HTML 文件,所以編輯、排版什麼的學習下 HTML。

3.4 製作目錄

文件中存在 HTML 的 h 標籤時,點擊生成目錄按鈕就可以自動生成目錄,我們在前面數據抓取時已經自動添加了 h1 標籤:

3.5 製作封面

封面本質上也是 HTML,可以編輯,也可以從頁面爬取,就留給大家自己實現吧。

3.6 編輯元數據

編輯書名、作者等信息:

3.6 輸出 ePub

編輯完成後保存,取個名字:

輸出可以使用電子書閱讀軟體打開查看,我用的是 Calibre,還可以方便的轉換為相應的格式裝到 Kindle 中閱讀。

整個過程就結束了,文章內代碼提交到碼云:https://goo.gl/yjGizR,接下來自由發揮,請開始你的表演。

參考資料

爬蟲 Scrapy 學習系列之一:Tutorial:https://goo.gl/LwqouP。

相關焦點

  • 用人話教你入門Python[簡單爬取網頁內容]
    但是我發現網頁太多,收集起來好累……於是我做了一隻叫「網絡爬蟲」的蜘蛛,把它丟在網際網路上,告訴它,見到新的網站你就吃進肚子裡,重複的網站就不要吃了,吃完一個網站就再吃跟這個網站有連結的新網站……直到你把網際網路所有不重複的網站吃掉就跑回來吐給我哦我們這裡不需要像Goodle公司那樣爬取很多網頁,先學爬一個網頁裡的部分內容就好了
  • 用Python進行Web爬取數據
    那麼,如何應對數據匱乏的問題呢?實現此目的最有效,最簡單的方法之一就是通過網頁抓取。我個人發現網絡抓取是一種非常有用的技術,可以從多個網站收集數據。如今,某些網站還為你可能希望使用的許多不同類型的數據提供API,例如Tweets或LinkedIn帖子。但是有時你可能需要從不提供特定API的網站收集數據。這就是web抓取能力派上用場的地方。
  • 用Python製作「菜鳥學Python」電子書-上篇
    如果能整理成電子書該多好啊,可以系統的閱讀!想到了萬能的Python,於是把我的簡書上的「菜鳥學python」進行爬取,效果還不錯。總體思路是獲取文章列表和URL、對每篇文章進行滾動截屏、圖片處理和拼接、圖片轉換為pdf、將多個pdf文件進行合併成一個文檔並添加標籤,由於涉及內容較多決定分兩篇文章來進行闡述。
  • 爬取《The Hitchhiker's Guide to Python!》python進階書並製成pdf
    前幾篇文章我們學習了requests庫和正則,還有個urllib庫,我上篇文章也用了requests庫來教大家去爬那些返回json格式的網頁,挺好玩的
  • python爬取數據存入資料庫
    昨天本來寫了一篇關於python爬取的文章,結果沒通過,正好今天一起吧。用python同時實現爬取,和存入資料庫,算是複習一下前面操作資料庫的知識。1、準備工作既然是爬取,那自然要連接到爬取的頁面,所以需要requests庫。
  • 技術分享|利用Python和BeautifulSoup進行網頁爬取(新手教程)
    使用Python與BeautifulSoup可以很容易的進行網頁爬取,通過網站爬蟲獲取信息可以幫助企業或個人節省很多的時間和金錢。學習本文之後,我相信大部分新手都能根據自己的需求來開發出相應的網頁爬蟲。
  • 如何用 Python 爬取天氣預報
    /software/BeautifulSoup/bs4/doc/沒有Python基礎的新人,我建議可以學習以下資料:1、官方最新的英文文檔(https://docs.python.org/3/)2、python 3.60版本中文文檔(http://www.pythondoc.com/pythontutorial3/index.html)3、廖雪峰Python
  • Python爬取B站彈幕並製作詞雲圖
    如何找到彈幕數據? 地址,彈幕的數據都包含在內了(如下圖所示) 彈幕數據的url地址既然都知道了,那麼就可以直接爬取下來了。 4、批量爬取彈幕數據 之前只是爬取一天的彈幕數據,如果想要爬取一段時間內容的彈幕數據的話,只需要改變url
  • 用python分析上海二手房數據,用幾十行代碼爬取大規模數據!
    spider_1('http://esf.xian.fang.com/')4、循環翻頁爬取二手房信息考慮到每頁只顯示30條,總共100頁,寫一個循環調用的語句,把100頁的內容全部爬下來# 循環,把第2-100頁全部爬下來page = 1while page 由於房天下的二手房信息是實時更新的,其默認排序是按照發布時間,因此在爬取過程中
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    在當今社會,網際網路上充斥著許多有用的數據。我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?網絡爬蟲,也叫作網絡數據採集,是指通過編程從Web伺服器請求數據(HTML表單),然後解析HTML以提取所需的數據。
  • Excel與Python爬取數據,兩者PK,誰優誰劣?
    小夥伴們大家好~Excel和python作為當前兩款比較火的數據分析處理工具,兩者之間有很多共性也有很大的區別。今天一起來看下在抓取網頁數據這塊,兩者有什麼異同點。如果用python爬取上面的網頁,只需要三行代碼,如下圖所示:這裡沒有用BS4,xpath等網頁解析方法,pandas提供了read_html的功能,可以直接獲取網頁數據。與Excel相比,python的優勢在於效率與便捷性。
  • 親媽級python乾貨分享!400集教程十電子書
    30天從零學會python技能,高效辦公,從職場中脫穎而出!立志成為最好的自己!一起悄悄變優秀變強大![給力]為什麼要學Python?①新媒體崗位:爬取近期特別火的話題、段子等,對產出爆款文章幫助很大。②電商崗位:進行相關活躍用戶量、轉化、留存、GMV等數據,非常便捷。③財務崗位:完成龐大的稅務數據統計,公司整體財務分析,以及第二年支出預測。④品牌設計崗位:通過Python可以批量下載處理圖片。⑤人事行政崗位:爬取公司資產盤點,整理和記錄自動生成考勤,考勤後的薪資計算。
  • Python爬蟲層層遞進,從爬取一章小說到爬取全站小說!
    很多好看的小說只能看不能下載,教你怎麼爬取一個網站的所有小說知識點:
  • 我用Python來爬取了小說《花千骨》……
    1.Beautiful Soup1.Beautifulsoup 簡介此次實戰從網上爬取小說,需要使用到Beautiful Soup。Beautiful Soup為python的第三方庫,可以幫助我們從網頁抓取數據。
  • 如何用電子書來獲取亞馬遜取客戶郵件【詳解】
    獲取亞馬遜客戶的郵件信息是一直都是非常頭痛的事情,很多人甚至花錢找第三方軟體來爬取自己的客戶的郵箱和電話,但是成功率很低。可行的,但是有時候你的買家不在會甚至不信任你會給他5USD 或者10美金等等,所以電子書是比較靠譜的,問題來了如何獲取?如何送電子書? 方法很多,你可以用wordpress 來搭建單個頁面著陸頁也可以,或者wix 來創建都可以,但是今天和大家分享一個最簡單的一個方法利用mailchimp來製作著陸頁獲取客戶的郵件。
  • 如何使用 Python 和 BeautifulSoup 爬取網站
    你需要的是 Web 爬取。Web 爬取可以自動提取數據,並以一種讓你可以輕鬆理解的格式顯示出來。Web 爬取可以用於許多場景,但本教程將重點介紹它在金融市場中的應用。 網際網路上的信息如此之多,任何人窮其一生也無法全部消化吸收。你需要的不是訪問這些信息,而是一種可伸縮的方式,可以用來收集、組織和分析這些信息。你需要的是 Web 爬取。
  • stata調用python爬取時間數據——借他山之石以攻玉
    該功能使得,我們可以先利用python爬取數據,然後再利用用戶所熟悉的stata去處理數據,因為stata在處理數據方面具有一定的優勢。那麼今天我們就來看看,怎樣利用stata調用python爬取數據,再用stata進行處理?今天試爬的數據是巨潮網上的預約年報的披露時間數據。
  • 如何爬取全網1200本Python書|爬蟲實戰篇
    這是菜鳥學Python的第98篇原創文章閱讀本文大概需要3分鐘    前面寫了一篇文章關於爬取市面上所有的Python書思路,這也算是我們數據分析系列講座裡面的一個小的實戰項目。上次代碼沒有寫完,正好周末有時間把代碼全部完成並且存入了資料庫中,今天就給大家一步步分析一下是我是如何爬取數據,清洗數據和繞過反爬蟲的一些策略和點滴記錄。1)
  • python爬取+BI分析5000條內衣數據,發現妹子最愛這款文胸
    生活中我們經常會用python進行數據爬取,但是爬取簡單分析難,很多人喜歡用echarts圖表接口或者是python的第三方庫進行數據可視化,甚至是用matlab,基本上都需要用代碼實現,在數據展示上十分繁瑣,效率不高。
  • Stata 網頁表格爬取示例
    本文以爬取東方財富網 CPI 數據[1]為例,講解如何使用 Stata 進行網頁表格數據爬取。Stata 雖非數據爬取利器,但是能夠輕鬆解決一些小的數據爬取任務。數據爬取的本質無非是數據請求和數據處理,因此熟練使用 Stata 進行數據爬取往往也是很好的數據處理能力的象徵。在實際應用中,我們經常需要爬取一些公開數據。