废话不多说,直接上代码:https://github.com/hilqiqi0/crawler/tree/master/simple/bilibili%20-%20redis
一、项目介绍:
爬取bilibili网站上的全部视频信息(不包含直播;广告和放映厅栏);信息量为千万级,爬取任务较为重,所以采取分布式爬虫。
二、说明:
a、设备说明:
1、mysql和redis部署在同一台linux(也可以分开部署);
2、爬虫部署在其他机器上;
3、另外所有机器均处于同一个局域网中;
4、采用私密ip代理
b、使用说明:
爬虫设备:
cd ..../bilibili - redis
./bl-redis.sh 1 # 1.修改权限:chmod 777 bl-redis.sh; 2、 此命令后面的数字表示要开启的爬虫个数,可以同时开启多个;若是想要启动5个爬虫,就是./bl-redis.sh 5
redis设备:
$ redis-cli -h 192.168.1.111 -p 6379
>> lpush BlblSpider:start_urls http://www.bilibili.com
三、安装
1、安装redis
1、查看系统是否安装redis(centos系统)
rpm -qa | grep "redis"
2、安装redis
yum install redis
3、版本查看
redis-server -v
4、测试连接:
本地:redis-cli -h 127.0.0.1 -p 6379
远程:redis-cli -h 192.168.1.111 -p 6379
5、redis命令
删除全部:Flushall
查看所有key:keys *
添加key:set kk 123
查看key:get kk
爬虫入口url:lpush BlblSpider:start_urls http://www.bilibili.com
2、安装 scrapy-redis
注:代码为python2.7
pip2 install scrapy-redis
三、代码
1、redis设置
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 去重机制
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # redis调度机制
SCHEDULER_PERSIST = False # 爬虫关闭时,是否清除redis去重
SCHEDULER_FLUSH_ON_START = True # 爬虫启动时候,是否清除redis中的keys
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue" # request队列机制
REDIS_HOST = '192.168.1.111' # redis 的ip地址
REDIS_PORT = 6379 # redis 的连接端口
2、关闭爬虫
采取扩展接口,调用extensions.py 中的函数,避免爬虫长期空跑
MYEXT_ENABLED = True # 开启扩展
IDLE_NUMBER = 720 # 配置空闲持续时间单位为 360个 ,一个时间单位为5s。 360个:半小时
# 在 EXTENSIONS 配置,激活扩展
EXTENSIONS = {
'bilibili.extensions.RedisSpiderSmartIdleClosedExensions': 500,
}
3、ip代理
说明:这里采用的时 快代理 的api接口,代码中的接口已经失效
DOWNLOADER_MIDDLEWARES = {
# 'bilibili.middlewares.BilibiliDownloaderMiddleware': 543,
# 'bilibili.middlewares.ChangeProxy': 543, # 取消此处的注释,就可以在访问时进行ip切换
}
另外关于ip代理需要思考的几个问题:
1、什么时候需要切换ip
本身的ip本ban,被拉黑了,无法继续使用该ip请求目标网站
2、切换ip是否需要支出
(一般需要购买)免费的ip不需要花钱,不免费的ip需要花钱;但是,大部分绝大部分很大一部分的免费ip是不能用的
3、如何更优秀的切换ip
a、代理ip给我们的api,是有请求限制的,例如有的限制3s,有的限制5s,等等
b、可能我们的一个代理ip获取后,很快就会失效了;所以,一般情况下,代理ip都是先验证,后使用
c、很有可能一个代理ip,我们可以访问网页多次,才会被ban
完善代理ip切换功能需要考虑的几个问题:
1)ip是否可以
2)ip用多少次清除掉
3)每次获取多少ip