【Python编程】18行代码爬小说(零基础)

文艺青年打造计划 2018-11-18 16:05:01

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

    搜索“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、加载库

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

from bs4 import BeautifulSoup
import requests
import time

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

    本文以http://www.22zw.com的《诛仙》为例。

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

    进入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”的<div>标签下的<h1>标签里。

    回到PyCharm,输入以下代码

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

    

    然后右键正文 → 检查

    发现正文在“id = content”的<div>标签里,输入代码

text = Soup.select('#content')[0].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)) for i in range(1282872, 1282915)]

    print(urllist)结果如下

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

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

from bs4 import BeautifulSoup
import requests
import time

urllist = ['http://www.22zw.com/files/article/html/27/27115/{}.html'.format(str(i)) for i in range(1282872, 1282915)]
for each_url in urllist:
try:
wb_data = requests.get(each_url)
wb_data.encoding = "gbk"
       
Soup = BeautifulSoup(wb_data.text, 'lxml')
title = Soup.select('div.bookname > h1')[0].text
text = Soup.select('#content')[0].text
with open('D:/zhuxian.txt', 'a', encoding='utf-8') as f:
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爬虫的能力远不止如此,本文仅涉及最基本的功能。

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

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

    每天进步一点点,共勉!


    

    

    


    




    

友情链接