使用 Scrapy 抓取电子书
如何抓取数据?首先,我们要看从哪里得到它。打开《修真小主播》页面,如下图:
有一个目录选项卡。点按此标签以查看目录。使用浏览器的元素查看工具,我们可以找到目录和每一章的相关信息。根据这些信息,我们可以抓取到特定的页面:
获取章节地址
现在我们打开文件xzxzb.py,这是我们刚刚创建的爬虫:
#-*-编码:utf-8-*-
进口废品
classXzxzbSpider(scrapy。蜘蛛):
name='xzxzb '
allowed_domains=['qidian.com']
start _ URLs=[' http://qidian.com/']
defparse(自身,响应):
及格
Start_urls是目录地址,爬虫会自动爬这个地址,然后在下面的解析中处理结果。现在,让我们编写代码来处理目录数据。首先,爬取小说首页获取目录列表:
defparse(自身,响应):
pages=response . XPath('网络小说四大名著//div[@ id=' j-catalog wrap ']//ul[@ class=' cf ']/Li ')
forpageinpages:
url=page.xpath('。/child : a/attribute : href’)。提取()
printurl
及格
从网页中获取DOM数据有两种方法,一种印章生成器是使用CSS选择器,另一种是使用XML xPath查询。
我们在这里生成器网名使用xPath。请自网络小说作家排行榜学相关知识。看看上面的代码。首先,我们通过ID获取目录框,并获取cf类以获取目录列表:
pages=response . XPath('//div[@ id=' j-catalog wrap ']//ul[@ class=' cf ']/Li ')网页游戏前十名
然后,遍历子节点,在li标签中查询子节点A的href属python123性,最后打印出来:
forpageinpages:
u生成器网名rl=page.xpath('。/child : a/attribute : href’)。提取()
printurl
这样就可以说是写好了爬章路径的小爬虫。使爬取网页数据用以下命令运行xzxzb cr网页游戏awler来检查结果:
scrapycrawlxzxzb
此时,我们的程序可能有以下错误:
…
importerror : nomodulenamed win32 API
…
运行以下语python安装教程句:
pipinstallpypiwin32python安装教程
屏幕输出如下:
.
[u '//read . qidian.com/chapter/murzjqcy 6 myoloery 3 wdhg 2/WRR dun 6 auilobdflr 9 quqa 2 ']
[u '//read . qidian.com/chapter/murzjqcy 6 myoloery 3 wdhg 2/Jh-j 5 usgyw 62 ujcmpdsvga 2 ']
[u '//read . qidian.com/chapter/murzjqcy 6 myoloery 3 wdhg 2/5yxhdbvg 1 imagfxrmrujdw 2 ']
[u '//read . qidian.com/chapter/murzjqcy 6 myoloery 3 wdhg 2/fw 5 ebekat-76 itti _ ilq 7a 2 ']
[u '//read . qidian.com/chapter/murzjqcy 6 myoloery 3 wdhg 2/ksf H5 vuti 6 PWR jbx 3 wa 1 aa 2 ']
[u '//read . qidian.com/chapter/murzjqcy 6 myoloery 3 wdhg 2/-mpkj 01 GPP 1 p 4 rpq 4 FD 4k q 2
9;] [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'] >...爬取章节路径的小爬虫就写好了,但我们的目的不仅于此,我们接下来使用这些地址来抓取内容:
章节页面分析
我们接下来分析一下章节页面,从章节页面我python编程们要获取标题和内容。
如果说章节信息爬取网页设计使用的 parser 方法,那么我们可以给每一个章节内容的爬取写一个方法,比如:parser_chapt网络小说的弊端er,先看看章节页面的具押韵生成器体情况:
可以看到,章节的整个内容在类名为 main-text-wrap 的 div 标签内,标题是其中类名为j_chapterName网页的 h3网页历史记录在哪里 标签,具体内容是类名为read-content j_readContent的 div 标签。
试python基础教程着把这些内容python安装教程打印出来:
#-*-coding:utf-8-*- importscrapy classXzxzbSpider(scrapy.Spider): name='xzxzb' allowed_domains=['qidian.com'] start_urls=['https://book.qidian.com/info/1010780117/'] defparse(self,response): pages=response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li') forpageinpages: url=page.xpath('./child::a/attribute::href').extract_first() #yieldscrapy.Request('https:'+url,callback=self.parse_chapter) yieldresponse.follow(url,callback=self.parse_chapter) pass defparse_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-contentj_readContent"]').extract_first().strip() printtitle #printcontent pass
上一步,我们获取到了一个章节生成器函数地址,从输出内容来看是相对路径,因此我们使用了yieldpython123 respo网页游戏中心nse.follow(u网页无法访问rl, callback=s爬取豆瓣电影top250elf.parse_chapter),第二个参数是一个回调函数,用来处理章节页面,爬取到章节页面后我们解析页面和标题保存到文件。
next_page=response.urljoin(url) yieldscrapy.Request(next_page,callback=self.parse_chapter)
scrapy.Request 不同于使用 response.follow,需要通过相对路径构造出绝对路径,response.follow 可以直接使用相对路径,因此就不需要调用 urljoin 方法了。
注意,response.follow 直接返回一个 R网页无法访问equest 实例,可以直接通过 yield 进python保留字行返回。
数据获取了python是什么意思之后是存储,由于我们要的是 html 页面,因此,我们就按标题存储即可,代码如下:
defparse_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-contentj_readContent"]').extract_first().strip() #printtitle #printcontent filename='./down/%s.html'%(title) withopen(filename,'wb')asf: f.write(content.encode('utf-8')) pass
至此,我们已经成功的抓取到了我们的数据,但还不能直接使用,需要整理和优化。
数据整理
首先,我们网页被禁用了怎么解除爬取下来的章节页面排序不是很好,如果人工去排需要太多的时间精力;另外,章节内容包含许多额外的东西生成器网名,阅读体验不好,我们需要优化内容的排版和可读性。
我们先给章节排个序,因为目录中的章节列表是按顺序排列的,所以只需要给下载页面名称添加一个顺序号就行了。
可是保存网页的代码是回调函数,顺序只是在处理目录的时候能确定网页历史记录在哪里,网络小说作家回调函数怎么能知道顺序呢?因此,我们要告诉回网页浏览器调函数它处理网络小说章节的顺序号,我们要给回调函数传参,修改后的代码是这样的:
defparse(self,response): pages=response.xpath('//div[@id="j-catalogWrap"]//ul[@class="cf"]/li') forpageinpages: url=page.xpath('./child::a/attribute::href').extract_first() idx=page.xpath('./attribute::data-rid').extract_first() #yieldscrapy.Request('https:'+url,callback=self.parse_chapter) req=response.follow(url,callback=self.parse_chapter) req.meta['idx']=idx yieldreq pass defparse_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-contentj_readContent"]').extract_first().strip() #printtitle #printcontent filename='./down/%s_%s.html'%(idx,title) cnt='<h1>%s</h1>%s'%(title,content) withopen(filename,'wb')asf: f.write(cnt.encode('utf-8')) pass
使用 Sigil 制作电子书
加载 html 文件
要制作 ePub 电子书,我们首先通过 Sigil 把我们python是什么意思的抓取的文件加载到程序中,在添加文件对话框中我们全选所有文件:
制作目录
文件网页历史记录在哪里中存在 HTML网络小说作家 的 h 标签时,点击生成目录按钮就可以python保留字自动生成目录,我们在前面数据抓取时已经自动添python语言加了python123平台登录 h1 标签:
制作封面
封面本质上也是 HTML,可以编辑,也可以从页面爬取,就留给大家自己实现吧。
.