本文來自作者在 GitChat 上分享「如何用 Python 爬取網(wǎng)頁制作電子書」主題內容。使" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > 教你如何用 Python 爬取網(wǎng)頁制作電子書

教你如何用 Python 爬取網(wǎng)頁制作電子書

時間:2023-07-04 06:48:02 | 來源:網(wǎng)站運營

時間:2023-07-04 06:48:02 來源:網(wǎng)站運營

教你如何用 Python 爬取網(wǎng)頁制作電子書:
作者簡介:孫亖,軟件工程師,長期從事企業(yè)信息化系統(tǒng)的研發(fā)工作,主要擅長后臺業(yè)務功能的設計開發(fā)。
本文來自作者在 GitChat 上分享「如何用 Python 爬取網(wǎng)頁制作電子書」主題內容。

使用 Scrapy 抓取電子書

爬蟲思路

怎么抓取數(shù)據(jù),首先我們要看從哪里取,打開《修真小主播》的頁面,如下:

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

獲取章節(jié)地址

現(xiàn)在我們打開 xzxzb.py 文件,就是我們剛剛創(chuàng)建的爬蟲:

# -*- coding: utf-8 -*-import scrapyclass XzxzbSpider(scrapy.Spider): name = 'xzxzb' allowed_domains = ['qidian.com'] start_urls = ['http://qidian.com/'] def parse(self, response): passstart_urls 就是目錄地址,爬蟲會自動爬這個地址,然后結果就在下面的 parse 中處理?,F(xiàn)在我們就來編寫代碼處理目錄數(shù)據(jù),首先爬取小說的主頁,獲取目錄列表:

def parse(self, response): pages = response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li') for page in pages: url = page.xpath('./child::a/attribute::href').extract() print url pass獲取網(wǎng)頁中的 DOM 數(shù)據(jù)有兩種方式,一種是使用 CSS 選擇子,另外一種是使用 XML 的 xPath 查詢。

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

pages = response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li')接著,遍歷子節(jié)點,并查詢 li 標簽內 a 子節(jié)點的 href 屬性,最后打印出來:

for page in pages: url = page.xpath('./child::a/attribute::href').extract() print url這樣,可以說爬取章節(jié)路徑的小爬蟲就寫好了,使用如下命令運行 xzxzb 爬蟲查看結果:

scrapy crawl xzxzb這個時候我們的程序可能會出現(xiàn)如下錯誤:

ImportError: No module named win32api運行下面的語句即可:

pip install pypiwin32屏幕輸出如下:

> ...> [u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/wrrduN6auIlOBDFlr9quQA2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/Jh-J5usgyW62uJcMpdsVgA2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/5YXHdBvg1ImaGfXRMrUjdw2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/fw5EBeKat-76ItTi_ILQ7A2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/KsFh5VutI6PwrjbX3WA1AA2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/-mpKJ01gPp1p4rPq4Fd4KQ2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/MlZSeYOQxSPM5j8_3RRvhw2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/5TXZqGvLi-3M5j8_3RRvhw2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/sysD-JPiugv4p8iEw--PPw2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/xGckZ01j64-aGfXRMrUjdw2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/72lHOJcgmedOBDFlr9quQA2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/cZkHZEYnPl22uJcMpdsVgA2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/vkNh45O3JsRMs5iq0oQwLQ2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/ge4m8RjJyPH6ItTi_ILQ7A2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/Y33PuxrKT4dp4rPq4Fd4KQ2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/MDQznkrkiyXwrjbX3WA1AA2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/A2r-YTzWCYj6ItTi_ILQ7A2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/Ng9CuONRKei2uJcMpdsVgA2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/Q_AxWAge14pMs5iq0oQwLQ2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/ZJshvAu8TVVp4rPq4Fd4KQ2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/hYD2P4c5UB2aGfXRMrUjdw2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/muxiWf_jpqTgn4SMoDUcDQ2'][u'//read.qidian.com/chapter/MuRzJqCY6MyoLoerY3WDhg2/OQQ5jbADJjVp4rPq4Fd4KQ2']> ...爬取章節(jié)路徑的小爬蟲就寫好了,但我們的目的不僅于此,我們接下來使用這些地址來抓取內容:

章節(jié)頁面分析

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

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

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

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

# -*- coding: utf-8 -*-import scrapyclass XzxzbSpider(scrapy.Spider): name = 'xzxzb' allowed_domains = ['qidian.com'] start_urls = ['https://book.qidian.com/info/1010780117/'] def parse(self, response): pages = response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li') for page in pages: url = page.xpath('./child::a/attribute::href').extract_first() # yield scrapy.Request('https:' + url, callback=self.parse_chapter) yield response.follow(url, callback=self.parse_chapter) pass def parse_chapter(self, response): title = response.xpath('//div[@class="main-text-wrap"]//h3[@class="j_chapterName"]/text()').extract_first().strip() content = response.xpath('//div[@class="main-text-wrap"]//div[@class="read-content j_readContent"]').extract_first().strip() print title # print content pass上一步,我們獲取到了一個章節(jié)地址,從輸出內容來看是相對路徑,因此我們使用了yield response.follow(url, callback=self.parse_chapter),第二個參數(shù)是一個回調函數(shù),用來處理章節(jié)頁面,爬取到章節(jié)頁面后我們解析頁面和標題保存到文件。

next_page = response.urljoin(url)yield scrapy.Request(next_page, callback=self.parse_chapter)scrapy.Request 不同于使用 response.follow,需要通過相對路徑構造出絕對路徑,response.follow 可以直接使用相對路徑,因此就不需要調用 urljoin 方法了。

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

數(shù)據(jù)獲取了之后是存儲,由于我們要的是 html 頁面,因此,我們就按標題存儲即可,代碼如下:

def parse_chapter(self, response): title = response.xpath('//div[@class="main-text-wrap"]//h3[@class="j_chapterName"]/text()').extract_first().strip() content = response.xpath('//div[@class="main-text-wrap"]//div[@class="read-content j_readContent"]').extract_first().strip() # print title # print content filename = './down/%s.html' % (title) with open(filename, 'wb') as f: f.write(content.encode('utf-8')) pass至此,我們已經(jīng)成功的抓取到了我們的數(shù)據(jù),但還不能直接使用,需要整理和優(yōu)化。

數(shù)據(jù)整理

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

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

可是保存網(wǎng)頁的代碼是回調函數(shù),順序只是在處理目錄的時候能確定,回調函數(shù)怎么能知道順序呢?因此,我們要告訴回調函數(shù)它處理章節(jié)的順序號,我們要給回調函數(shù)傳參,修改后的代碼是這樣的:

def parse(self, response): pages = response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li') for page in pages: url = page.xpath('./child::a/attribute::href').extract_first() idx = page.xpath('./attribute::data-rid').extract_first() # yield scrapy.Request('https:' + url, callback=self.parse_chapter) req = response.follow(url, callback=self.parse_chapter) req.meta['idx'] = idx yield req pass def parse_chapter(self, response): idx = response.meta['idx'] title = response.xpath('//div[@class="main-text-wrap"]//h3[@class="j_chapterName"]/text()').extract_first().strip() content = response.xpath('//div[@class="main-text-wrap"]//div[@class="read-content j_readContent"]').extract_first().strip() # print title # print content filename = './down/%s_%s.html' % (idx, title) cnt = '<h1>%s</h1> %s' % (title, content) with open(filename, 'wb') as f: f.write(cnt.encode('utf-8')) pass

使用 Sigil 制作電子書

加載 html 文件

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

制作目錄

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

制作封面

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




.

關鍵詞:電子

74
73
25
news

版權所有? 億企邦 1997-2025 保留一切法律許可權利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關閉