喜欢看电子书的朋友,经常会碰到这种情况:
搜索“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爬虫的能力远不止如此,本文仅涉及最基本的功能。
爬虫还可以按需要爬各种图片、种子文件、淘宝价格、房价等数据,更可以爬取大量数据做大数据分析。
在这个信息时代,如果有想法,肯努力,爬虫会给生活带来意想不到的惊喜和便利。
每天进步一点点,共勉!
领取专属 10元无门槛券
私享最新 技术干货