起点小说爬取-scrapy/redis/scrapyd

之前写了一篇网络字体反爬之pyspider爬取起点中文小说

可能有人看了感觉讲的太模糊了,基本上就是一笔带过,一点也不详细。这里要说明一下,上一篇主要是因为有字体反爬,所以我才写了那篇文章,所以主要就是提一个字体反爬的概念让大家知道,其中并没有涉及到其他比较难的知识点,所以就是大概介绍一下。

今天依然是起点小说爬取。不过我们今天换一个框架,我们使用scrapy加上redis去重过滤和scrapyd远程部署,所以主要的爬取代码基本与上篇一致,在文章最后我会把git地址贴上,大家看看源码。

scrapy

官方文档

安装scrapy 。

安装完后我们简单介绍一下scrapy的部分配置。

setting配置文件

爬虫类

属性

方法

items

items实际就是要爬取的字段定义,一般情况我们写scrapy时,首先就要确定自己需要获取那些数据

定义:

调用:

可以这样转换为字典:dict(product),主要是在一些必须使用dict类型的场景使用,比如MongoDB插入数据。

pipelines

必须在settings中,添加

对象如下:

process_item

open_spider

close_spider

from_crawler

运行

命令行中运行:

pycharm 运行

在 项目 根目录 添加 run.py 文件:

或者:

redis

Redis安装:https://www.jianshu.com/p/50694e644c25

官网文档:https://redis.io/documentation

中文文档:http://www.redis.cn/documentation.html

Redis数据库是内存数据库,性能极高,因此经常被用来配合其他非内存数据库使用,查询速度非常快,但是它是不安全的,因为数据在内存中,所以如果遇到异常会造成数据丢失。虽然它的数据也会保存在硬盘中,但是不是实时保存。总之一定要注意:

不要把 Redis 用作主要的数据存储数据库!!!!

不能存储太多的信息!!大数据量的信息不要存储到Redis

特点:

优势:

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

redis.conf 配置项说明如下:(我们使用的是默认配置哦)

scrapyd

官方文档:http://scrapyd.readthedocs.io/en/stable/

scrapyd是运行scrapy爬虫的服务程序,它支持以http命令方式发布、删除、启动、停止爬虫程序。而且scrapyd可以同时管理多个爬虫,每个爬虫还可以有多个版本。

特点:

安装

配置scrapyd.conf

官方说明配置文档位置:

/etc/scrapyd/scrapyd.conf (Unix)

c:\scrapyd\scrapyd.conf (Windows)

/etc/scrapyd/conf.d/* (in alphabetical order, Unix)

scrapyd.conf

~/.scrapyd.conf (users home directory)

default_scrapyd.conf

发布项目

将/Library/Frameworks/Python.framework/Versions/3.6/bin目录下的scrapyd-deploy添加到环境变量

ln -s /Library/Frameworks/Python.framework/Versions/3.6/bin/scrapyd-deploy /usr/local/bin/scrapyd-deploy。

Windows下在python安装目录下找找吧,我用的Mac没法尝试了。

修改 scrapy.cfg

修改前:

去掉url前的注释符号,这里url就是你的scrapyd服务器的网址

修改为:

[deploy] 修改为 [deploy:pro_qidian],这个 target:pro_qidian是爬虫服务器的名称 ,这个 [deploy] 可以配置多个。

修改后:

查看scrapd服务配置

打开控制台,切换到 scrapy 项目根目录,执行

发布爬虫

scrapyd-deploy -p

--version

target:之前scrapy.cfg配置的 [deploy:127] 中的 127

project:项目名称,一般使用和scrapy项目一个名字

version:版本号,默认是当前时间戳

还有一些控制的API,可以查看官方文档。

启动爬虫

在控制台中执行:

或者

BUG处理

builtins.KeyError: 'project'

解决:

进行post提交时,需要将参数提交放入到 params 或 data 中,而不是json

如: 或

TypeError:init() missing 1 required positional argument: 'self'

修改 spider ,增加 :

redis.exceptions.ConnectionError: Error 10061 connecting to localhost:6379

有类似这样的错误,是由于项目中有连接其他服务,譬如这里是redis数据库,需要先启动 对应的服务

模块就介绍到这里,下面看下我们项目的处理。

创建项目:

创建爬虫:

在settings中设置如下,其他的保持默认

先在item中定义我们要爬取的数据结构:

具体代码在我的GitHub上。

Redis去重

在spider文件中初始化一下redis

还有一块解析字体的地方需要修改,增加priority参数: ,这里需要说明一下,我们用scrapy.Request创建的请求会通过控制中心,传递给调度队列,调度器会根据优先级把队列中请求交给spider进行爬取。这里为什么要给字体解析请求加上高优先级呢?

字体解析请求本来就不多,只有几种而已

我们在parse中把所有页的请求都添加到调度器中,大概有4万多页,也就是4万多个请求

如果按照添加顺序进行请求处理,那么爬虫必须先处理完4万多条请求后,再处理字体请求,处理了字体请求才能获取出数据,交给pipeline进行处理。我之前没有加优先级,所以导致运行很长时间MongoDB中都没有数据。

再看一下pipeline:

scrapyd的使用比较简单,而且我已经部署了,没截图了,也就不详述了。

基本步骤:

修改项目scrapy.cfg文件,参见上面

在项目根目录执行scrapyd-deploy pro_qidian -p qidian --version v.0.1.0

启动爬虫:

浏览器中打开http://localhost:6800

选择job后可以查看爬虫状态

这一次概念比较多,写一下做个记录,增加自己的印象,以后也好查询。度娘上东西是不少,但是每次查询也挺麻烦。我以前不爱记录东西,感觉网上都能查到,这次能查出来,下次不是也能查出来。自从开始写爬虫实战后,看着阅读量和增加的关注度,就越有动力写。这真是一种良性循环。现在简书基本都变成我的笔记了,随时有东西想记录就打开记录,写好了能发布就发布,不能发布就保存自己看。算是我自己学习爬虫的一点点心得吧,鼓励大家多做笔记。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180518G1ZJXJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券