本文就以抓取起点中文小说网的小说作品基础信息作为目标,讲解如何使用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 的各种功能,适用于爬虫、自动化处理等各种情景。