Python使用Scrapy爬虫框架爬取天涯社区小说“大宗师”全文

大宗师是著名网络小说作家蛇从革的系列作品“宜昌鬼事”之一,在天涯论坛具有超级高的访问量。这个长篇小说于2015年3月17日开篇,并于2016年12月29日大结局,期间每天有7万多读者阅读。如果在天涯社区直接阅读的话,会被很多读者留言干扰,如图

于是,我写了下面的代码,从天涯社区该小说的第一篇开始依次爬取每一页,提取作者“蛇从革”发过的文字并保存成为记事本文档。当然,代码还可以再优化一下,例如有时候作者就发了一句话“今天没有了”,按说这样的话可以过滤掉,大家可以自行修改。

在运行代码之前,首先要正确安装Python的爬虫框架scrapy,这个扩展库在Python 2.7.x中表现一直不错,现在也支持Python 3.5.x以及更新版本,可以使用pip直接进行安装,但是scrapy依赖的某些扩展库对高版本Python支持并不是很好,在使用pip安装scrapy的过程中如果某个依赖的扩展库安装失败,可以到网上下载相应的whl文件进行安装,重复上面的过程,知道出现“Successfully installed...”这样的提示。

接下来就是创建爬虫项目了,进入命令提示符(cmd)环境,切换至Python安装目录的scripts目录,执行命令scrapy startproject xiaoshuo创建爬虫项目xiaoshuo,进入该目录,然后编写Python程序文件\spiders\spiderYichangGuishi.py(内容就是下面的代码),然后在命令提示符环境中执行命令scrapy crawl spiderYichangGuishi,稍等大概3分钟左右即可爬取小说全文并生成记事本文档。

当然,在编写爬虫代码之前,需要对目标网站进行分析一下,打开要小说首页,右键,单击“查看源代码”,然后分析网页结构,如图,红色标记处是比较重点的地方。

\spiders\spiderYichangGuishi.py代码如下:

import scrapy

class MySpider(scrapy.spiders.Spider):

#爬虫的名字,每个爬虫必须有不同的名字

name = 'spiderYichangGuishi'

#要爬取的小说首页,第一篇

start_urls = ['http://bbs.tianya.cn/post-16-1126849-1.shtml']

#对每个要爬取的页面,会自动调用下面这个方法

def parse(self, response):

#用来存放当前页中的小说正文

content = []

for i in response.xpath('//div'):

#作者蛇从革的天涯账号

if i.xpath('@_hostid').extract()==['13357319']:

for j in i.xpath('div//div'):

#提取文本

c = j.xpath('text()').extract()

#过滤干扰符号

g = lambda x:x.strip('\n\r\u3000').replace('<br>', '\n').replace('|', '')

c = '\n'.join(map(g, c)).strip()

content.append(c)

with open('result.txt', 'a+', encoding='utf8') as fp:

fp.writelines(content)

#获取下一页网址并继续爬取

url = response.url

d = url[url.rindex('-')+1:url.rindex('.')]

next_url = 'http://bbs.tianya.cn/post-16-1126849-{0}.shtml'.format(int(d)+1)

try:

yield scrapy.Request(url=next_url, callback=self.parse)

except:

pass

爬取到的小说大概就是下面的样子了

原文发布于微信公众号 - Python小屋(Python_xiaowu)

原文发表时间:2016-12-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沈唁志

PHP完成微信小程序在线支付功能

7472
来自专栏IMWeb前端团队

使用Node.js实现一个简单的ZooKeeper客户端

什么是ZooKeeper Zookeeper 是一个分布式的、开源的协调服务,用在分布式应用程序中。它提出了一组简单的原语,分布式应用程序可以基于这些原语之上...

2630
来自专栏码字搬砖

工作中用到的sh脚本(持续更新)

day=(date−d‘−0day′‘+echo“(date−d‘−0day′‘+echo“(date -d ‘-0 day’ ‘+%Y-%m-%d’) e...

2015
来自专栏FreeBuf

Firefox信息泄漏漏洞的技术分析(CVE-2018-12387)

研究发现,JavaScript JIT编辑器中的Array.prototype.push有多个存在安全问题的参数,而这些参数共同导致了这个信息泄漏漏洞的出现。这...

1403
来自专栏小狼的世界

在Codeigniter框架中使用NuSOAP

NuSOAP 是一组功能强大的PHP类,这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写,可以无缝的与许多最...

871
来自专栏CDA数据分析师

Python 探针实现原理

本文将简单讲述一下 Python 探针的实现原理。 同时为了验证这个原理,我们也会一起来实现一个简单的统计指定函数执行时间的探针程序。 探针的实现主要涉及以下几...

3448
来自专栏Java架构

阿里分布式服务框架Dubbo的架构总结总体架构参考补充

1994
来自专栏java一日一条

缓存穿透,缓存击穿,缓存雪崩解决方案分析

设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。

1172
来自专栏Java技术栈

分布式 | Dubbo 架构设计详解

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度...

1622
来自专栏康怀帅的专栏

E-mail 服务器配置

电子邮件是—种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。本次实验采用 二级域名邮箱:4s.khs1994.com DNS设置 hostname ...

3754

扫码关注云+社区

领取腾讯云代金券