首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

18行代码爬小说

喜欢看电子书的朋友,经常会碰到这种情况:

搜索“xxx.txt下载”,大部分网站要求注册登录,好不容易下载成功,看一半发现各种错别字,无可奈何只能找在线小说网站,忍受着漫天飞的广告,痛苦地看完。

大部分在线小说网站的文字质量很不错,却又不允许下载,但我们可以通过简单的爬虫把小说一章一章地爬下来,下面开始教程。

一、工具介绍

1、Python 3.x

Python语言是编写爬虫的最佳选择。

下载地址:https://www.python.org/downloads/

2、PyCharm

PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成等功能。

PyCharm编写爬虫,可以加快编写速度,及时发现错误,强烈推荐使用。如果不愿意下载Python,也可以直接用txt编写。

下载地址:http://www.jetbrains.com/pycharm/

3、非IE内核浏览器

推荐使用Chrome浏览器,查看网页源码非常方便。

下载地址:http://dl.pconline.com.cn/download/51614.html

注意:IE内核浏览器不能实时查看网页源码,无法实现爬虫!

二、前期准备工作

Python和PyCharm的安装不用多说,各项均默认安装就行了。安装完成后,开始搭建爬虫运行环境。

重要的一步:选择编译语言及安装必要的库

打开PyCharm,选择Configure → Settings → Project Interpreter → 选择刚刚安装的Python。

点击右边的 + 号,依次搜索【bs4】、【lxml】、【requests】点击 Install Package ,安装完成后,如上图。

三、编写爬虫

1、新建项目及Python文件

选择Create New Project,location设置成你想要的位置。

右键你创建的文件夹,New → Python File ,文件名自行命名。

2、加载库

在文件开头输入以下代码。

frombs4importBeautifulSoup

importrequests

importtime

3、分析并尝试爬取单个网页

为了测试本网站小说是否能顺利爬取成功,先任意用一章节做测试,这里我们选择“第一章 青云”,并复制该页网址。

进入PyCharm,依次输入以下代码。

将定义url字符串为网页网址

url ='http://www.22zw.com/files/article/html/27/27115/1282872.html'

使用requests库与beautifulsoup库解析该网页,将字符编码转换成 gbk

wb_data = requests.get(url)

wb_data.encoding ="gbk"

Soup = BeautifulSoup(wb_data.text,'lxml')

尝试输出解析后的网页

print(Soup)

右键run执行代码

出现以下结果,说明解析成功。然后删除 Print(Soup) 代码。

可以看出,爬取整个网页的结果非常杂乱,如何筛选出我们需要的信息呢?这就要用到Chrome的查看网页源码功能。

我们仅需要小说的 章节名 和 正文,右键章节名 → 检查,Chrome右侧就出现了章节名的源码定位。

可以看到,章节名是在“class=bookname”的

标签下的标签里。

回到PyCharm,输入以下代码

title = Soup.select('div.bookname > h1')[].text

然后右键正文 → 检查

发现正文在“id = content”的

标签里,输入代码

text = Soup.select('#content')[].text

输入print代码并运行,查看爬取结果

print(title,text)

单页网站爬取成功!

4、自动爬取网页并保存

单个网页爬取成功后,我们下面需要实现自动连续爬取并保存到txt文件,这里以第1章至第44章为例。

打开第1章和第44章的网页,观察网址差异,发现仅最后的编号有区别,且相减等于43,说明每一章的网页是按顺序排列的。

http://www.22zw.com/files/article/html/27/27115/1282872.html

http://www.22zw.com/files/article/html/27/27115/1282915.html

编写下列代码生成所有需要爬取的网页

urllist = ['http://www.22zw.com/files/article/html/27/27115/{}.html'.format(str(i))foriinrange(1282872,1282915)]

print(urllist)结果如下

这些就是所有需要爬取的网页列表了

接下来,需要编写循环让程序自动按顺序爬取。

frombs4importBeautifulSoup

importrequests

importtime

urllist = ['http://www.22zw.com/files/article/html/27/27115/{}.html'.format(str(i))foriinrange(1282872,1282915)]

foreach_urlinurllist:

try:

wb_data = requests.get(each_url)

wb_data.encoding ="gbk"

Soup = BeautifulSoup(wb_data.text,'lxml')

title = Soup.select('div.bookname > h1')[].text

text = Soup.select('#content')[].text

withopen('D:/zhuxian.txt','a',encoding='utf-8')asf:

f.write(str(title) +'\n'+str(text) +'\n')

f.close()

time.sleep(1)

except:

pass

以上就是最终代码,仅18行,下面解释一下代码。

(1)for...in...是遍历urllist的循环语句。

(2)使用try...except...语句是因为某些章节会跳跃编号,使用该语句,可以自动跳过错误网页。

(3)with open...as...是打开并写入txt的语句。

(4)time.sleep(1) 语句的意思是每执行完一次循环,暂停1s,这是非常必要的,如果没有间隔,很容易触发反爬机制,禁止你访问该网站。

执行后的txt文件打开如下

爬取成功!

当然,这样的txt还有一个小问题——没有分段。最简单的解决方法就是使用专业文字处理软件UltraEdit,将每个段落前的几个空格,替换成回车符(^p),这里就不细说了。

四、最后的话

Python爬虫的能力远不止如此,本文仅涉及最基本的功能。

爬虫还可以按需要爬各种图片、种子文件、淘宝价格、房价等数据,更可以爬取大量数据做大数据分析。

在这个信息时代,如果有想法,肯努力,爬虫会给生活带来意想不到的惊喜和便利。

每天进步一点点,共勉!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180401G0R03G00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券