使用pyspider抓取起点中文网小说数据

JavaScript06

使用pyspider抓取起点中文网小说数据,第1张

pyspider 是国人开发的相当好用的爬虫框架。虽然网上教程不是很多,但是文档详细,操作简单,非常适合用来做爬虫练习或者实现一些抓取数据的需求。

本文就以抓取起点中文小说网的小说作品基础信息作为目标,讲解如何使用pyspider框架采集数据。

关于为何要选择起点作为目标,其一、笔者作为网文爱好者,也想收集起点小说作品信息,找些热门小说看;其二、起点作为比较成熟的小说网站,再反爬虫方面应该有对应策略,刚好练习一下爬虫怎么规避这些策略。

在阅读本文之前,建议先看一下文档及框架作者本人写的中文教程

pyspider 爬虫教程(一):HTML 和 CSS 选择器

pyspider 爬虫教程(二):AJAX 和 HTTP

pyspider 爬虫教程(三):使用 PhantomJS 渲染带 JS 的页面

安装很简单,如果已安装pip,直接执行命令

由于目前很多网站都是动态js生成页面,需要安装 PhantomJS 来获得js执行后的页面,而不是原本静态的html页面,我们再来装一下

待安装完成后,我们先看一下pyspider对应的可执行命令

在这里我们直接执行如下命令启动,更复杂的命令参看 文档

首先看一下启动成功后,浏览器访问127.0.0.1:5000地址的界面如下

点击Create,新建项目

点击生成的项目名,进入脚本编写&调试页面

先看一下对应的爬虫脚本

1.测试抓取时,运行一段时间后出现所有抓取链接均FetchError的报错,抓取失败

失败原因:未设置User-Agent 及 抓取速率太快,导致IP被封禁

解决办法:

1) 设置User-Agent,调整速率从1->0.7

2) 使用代理IP,防止被封禁,这里笔者尝试使用搭建 简易免费代理IP池 ,但是由于免费代理大多不可用,会导致抓取不稳定,还是决定放弃使用

2.笔者本来是打算通过不断抓取下一页的链接,来遍历所有小说作品的,可是由于这部分是JS动态生成的,虽然使用phantomjs,能解决这个问题(具体见作者教程3),但是使用phantomjs会导致抓取效率变低,后来还是选择采用固定首尾页数(PAGE_START,PAGE_END)的方法

3.当使用css选择器有多个数据时,怎么获取自己想要的

比如在小说详细页,有字数,点击数,推荐数三个

其css selector均为 .book-info >p >em,要获取对应的次数只能使用pyquery的.eq(index)的方法去获取对应的文本数据了

4.如果遇到抓取的链接是https,而不是http的,使用self.crawl()方法时,需要加入参数validate_cert =False,同时需要确保pyspider --version 版本再0.3.6.0之上

具体解决方法,可以查看如下链接:

PySpider HTTP 599: SSL certificate problem错误的解决方法

简单数据分析之二

采用 SCWS 中文分词 对所有作品名字进行分词统计,得到出现频率最高的排行

看起来如果写小说,起个『重生之我的神魔异世界』这类标题是不是吊炸天

简单数据分析之三

简单统计一下起点作者的作品数排序

武侠精品应该是起点的官方作者号吧,不然194本作品也太恐怖了

也发现了不少熟悉的大神,比如唐家三少,流浪的蛤蟆,骷髅精灵等,有些作品还是可以看看的

纯粹前端的js 是不能 跨域 获取 cookie的

xxx.com 的js 代码 只能得到 xxx.com的cookie,拿不到 yyy.com

当然如果你有办法 在 yyy.com 写入受到自己控制的 html文件,你就可以写代码去拿到 对应的cookie,但看你的需求 应该你没有yyy.com 的权限

所以 要结合其他方案,推荐一下两种:

使用 electron ,electron 你可以认为是受js控制的浏览器引擎,所以你可以用它访问 yyy.com 拿到cookie,再接着做你的事情

或者 使用 puppeteer(Google 官方出品的 headless Chrome node 库)

Puppeteer 提供了一系列的 API,可以在无 UI 的情况下调用 Chrome 的各种功能,适用于爬虫、自动化处理等各种情景。

使用chrome中的response分析其html代码。

1、可以使用chrome中的response分析其html代码,html代码为标签格式,每个标签都是有开始成对出现的,我们要抓取小说排行榜信息,查看html代码,发现其标签中的信息为小说排行榜中的信息。

2、进一步查看每本书的信息使用标签来概括。

3、其中dat-rid标签代表的是这本身在该网页中属于第几个,panclass="rank-tagnoXX"代表的是这本身的排行榜book-mid-info标签中的XX中有书名信息。

4、需要抓取的排行帮以及书名信息在上面两个部分,接下来使用正则匹配表达,将每本书的上述两行信息提取出来,重新定义一个函数get_top_number_and_book_name。

5、由于小说名都是使用中文,所以需要用到\u4e00-\u9fa5,表示为匹配该段的中文字符,[\u4e00-\u9fa5]+,表示匹配所有中文,小说名除了中文还有英文,以及逗号,冒号等其他特殊形式的符合。

Python是一种计算机程序设计语言。作为一门叫做ABC语言的替代品。Python是一种面向对象、直译式计算机程序设计语言。