vlambda博客
学习文章列表

【python】保姆级网络爬虫爬取小说

很多同学在网站上看小说都遇到过广告过多,字体不好看,页面宽度不够,突然断网等问题。 看小说一气看完才叫爽。 用python能够快速的把全站所有小说爬取下来。 下面就交给大家这个酷炫的技能。

首先需要安装python。最简单的python运行环境就是anaconda

https://repo.anaconda.com/archive/Anaconda3-2020.02-Windows-x86_64.exe

https://repo.anaconda.com/archive/Anaconda3-2020.02-Windows-x86.exe

https://www.anaconda.com

https://www.anaconda.com/products/individual


https://parsel.readthedocs.io/en/latest/index.html

首先是安装:在安好的anaconda开始菜单目录下点击如下窗口

在窗口中输入下面命令即可安装parsel插件,发现没,安装啥插件直接就pip install+插件名,大部分情况直接就安装上了。

pip install parsel
下面是我安装的过程

【python】保姆级网络爬虫爬取小说

完成上面步骤就安装成功了 successfuly installed了
下面比划比划看看安装成功没输入下面命令
import requestsimport parsel

【python】保姆级网络爬虫爬取小说

单机运行看看效果,嗯没啥效果就对了,证明模块导入没有错误。 【python】保姆级网络爬虫爬取小说
工具就这俩requests如果没装执行上面pip install requests就ok了,好像安装完anaconda之后就自带了requests库。这就是anaconda的好处,已经集成了大部分库。
下面我们开始写代码。
首先需要写一个文件头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
这个东西 是为了仿真浏览器浏览信息的,浏览器浏览网站信息的时候就会告诉网站我是360   我是ie所以用headers区分开了,所以咱们也不好明目张胆的就去复制人家的东西,先伪装个马甲。
response=requests.get('http://www.shuquge.com/txt/8659/2324752.html', headers=headers)response.encoding = response.apparent_encodinghtml = response.text
这两句的意思是response变量(随便取的)等于requests这个是开始import进来的工具"."的意思就是这个工具下的一些命令,其中之一就是get获取网站信息,后面紧跟着网站名和头名,模拟浏览器获取网站信息。这个步骤不需要打开浏览器,不像前面介绍618抢购还得打开浏览器。
http://www.shuquge.com/txt/8659/2324752.html
以这个网站的这本 小说为例,我也没看过这本小说,随便找的 。打开网页后单击F12或者单击右键点击查看网站源代码

【python】保姆级网络爬虫爬取小说

我们想要提取文章的标题,我们发现标题是在class content下面 <h1>标签下,意思就是 class是组的意思,网站会把内容捆绑在一起管理content组下有个h是标题 h1是一级标题,这些都不重要,网站基本上的结构就是class id 再就是一些标签。
sel = parsel.Selector(html)
title = sel.css('.content h1::text').extract_first()
我们输入这条命令 title是我们定义的变量,随便取名,sel是parsel工具下的一个selector,其实就是筛查网页的一个功能容器,它将之前我们网站的代码放在sel里 sel是咱们随便申请的变量既然集成了selector的功能所以就可以用css了,css相当于网站的显示形式,里面一些标签都可以在这里找到。大家可以常看到一些书中html+css其实就是这个,网站的特效框架都归它管。
那么这句话的意思就是.content  "."的意思就是class的意思,别问为什么就这么规定的。简化命令么,之后h1标签下的text文档  extract_first只对第一条的意思

【python】保姆级网络爬虫爬取小说

运行完后,标题出来了

接下来内容

【python】保姆级网络爬虫爬取小说

内容我发现在id content下

contents = sel.css('#content::text').extract()
contents2 = []for content in contents: contents2.append(content.strip())print(contents)print(contents2)print("\n".join(contents2))

之后用这个命令将里面空格去掉

对比一下 消除空格前

【python】保姆级网络爬虫爬取小说

消除空格后

【python】保姆级网络爬虫爬取小说

是不是清爽多了。

好了,最后我们要讲内容放到txt文件里,得保存下来。

with open('D:/1.txt', mode='w', encoding='utf-8') as f: f.write("\n".join(contents2))

打开d盘下的1.txt然后as f 就是英文字面的意思,记做f

下面就用f表示上面的txt文件

f.write就是将上面的文本写入txt文件中

运行完,我们就发现

【python】保姆级网络爬虫爬取小说

D盘下保存着咱们的文件

那么现在只是第一章,问题是我们想下载全部的小说,此外我们已经写了好多的内容,之后的章节都是重复操作。所以我们把刚才写的内容先封装起了,就是变成函数。之后直接调用函数就完成咱们刚才所有的功能。

函数在python下用def来表示。

def download_one_chapter(target_url):     response = requests.get(target_url, headers=headers)      response.encoding = response.apparent_encoding      html = response.text      sel = parsel.Selector(html)      title = sel.css('.content h1::text').extract_first()      contents = sel.css('#content::text').extract()      contents1 = [content.strip() for content in contents]      text = '\n'.join(contents1)  print(text)      file = open(title + '.txt', mode='w', encoding='utf-8')      file.write(title)   file.write(text)     file.close() 

函数封装好了。稍微改了点内容,基本上也能看明白。一周直接用这个函数就是下载一章的内容,只要传入网址。

接下来我们还要读取一本小说的目录,经常读小说的同学会发现其实小说网址是一模一样的,只不过不同章节知识后面一个数字改变了,所以我们要找到所有章节的网址。

我们返回小说封面,同样打开源码我们发现章节实际上是在

dd标签下 href里的我们用命令

links = sel.css('dd a::attr(href)').extract()


def get_book_links(book_url):   response = requests.get(book_url)  response.encoding = response.apparent_encoding  html = response.text  sel = parsel.Selector(html)  links = sel.css('dd a::attr(href)').extract()  return links

我们想获得所有标签的网址所以也给它封装到函数里links就是所有章节的网址,例如2324763.html

那么完整的网址是

http://www.shuquge.com/txt/8659/2324752.html

实际上就是后面这部分么。下面我要下载完整的一本书其实就是把links里所有连接都下载下来

def get_one_book(book_url):  links = get_book_links(book_url)  for link in links:  print('http://www.shuquge.com/txt/8659/' + link)  download_one_chapter('http://www.shuquge.com/txt/8659/' + link)

找到这本书的连接,先得到章节目录,在for循环,循环links里所有的列表值放到link里。之后'http://www.shuquge.com/txt/8659/' + link就是我们章节的网址,在用我们封装好的章节的函数就可以下载了。

函数是都封装好了,下面我们开始运行主函数,其实python可以有主函数的

if __name__ == '__main__':  book_url = 'http://www.shuquge.com/txt/8659/index.html'  get_one_book(book_url)

if __name__ == '__main__':  就是主函数,函数先从这里运行

里面把书目录的链接放在里面直接就能下载整本小说了。

这篇文章遗留了一些问题,有很多同学想下载整个网站或者网站排行榜中所有的小说,下载它几百本,其实也是可以办到的,书的标记实际上就是网址:http://www.shuquge.com/txt/8659/index.html中8659这个数字,那么可以打开排行榜,找到所有小说的这个序号即可。还有就是保存txt文件的名字。我这里定义的是1.txt。那么如果下载多本小说就不能这么下载了。你们可以用文中说到的方法提取小说名字。作为txt文件的名字

with open('D:/1.txt', mode='w', encoding='utf-8') as f:就是这句1改成小说的名字变量即可。


文中css常用标志说明

#表示 id选择

.表示 class选择器
>表示子元素,层级
一个空格也表示子元素,但是是所有的后代子元素,相当于 xpath 中的相对路径


1.css可以通过元素的id、class、标签这三个常规属性直接定位到

2.如下是百度输入框的的html代码:

<input id="kw" class="s_ipt" type="text" autocomplete="off" maxlength="100" name="wd"/>

3.css用#号表示id属性,如:#kw

4.css用.表示class属性,如:.s_ipt

5.css直接用标签名称,无任何标示符,如:input