scrapy分页抓取网页(【干货】scrapy-redis框架抓取网页网页(一))
优采云 发布时间: 2022-04-11 18:34scrapy分页抓取网页(【干货】scrapy-redis框架抓取网页网页(一))
1. 介绍scrapy-redis 框架
scrapy-redis
一个基于redis的三方分布式爬虫框架,配合scrapy使用,使爬虫具备分布式爬虫的功能。
github地址:/darkrho/scrapy-redis
2. 分布式原理
scrapy-redis实现分布式,其实原理上很简单,这里为了描述方便,我们把我们的核心服务器叫做master,用来运行爬虫程序的机器叫做slave
我们知道要使用scrapy框架爬取一个网页,我们需要先给它一些start_urls。爬虫首先访问start_urls中的url,然后根据我们的具体逻辑,对里面的元素,或者其他二级三级页面进行操作。抓。要实现分布式,我们只需要在这个starts_urls中做文章
我们在master上建一个redis数据库(注意这个数据库只用于url存储),为每一种需要爬取的网站打开一个单独的列表字段。通过在slave上设置scrapy-redis来获取url的地址作为master地址。结果是虽然有多个slave,但是大家获取url的地方只有一个,那就是服务器master上的redis数据库
而且由于scrapy-redis自带的队列机制,slave获取的链接不会相互冲突。这样,每个slave完成爬取任务后,将得到的结果汇总到服务器。
益处
程序可移植性强,只要处理好路径问题,将slave上的程序移植到另一台机器上运行基本上就是复制粘贴的问题
3.分布式爬虫的实现使用了三台机器,一台是win10,一台是centos6,两台机器上部署了scrapy进行分布式爬虫。一个 网站
win10的IP地址为192.168.31.245,作为redis的master,centos的机器作为slave
master的爬虫在运行时会将提取的url封装成request放入redis中的数据库:“dmoz:requests”,从数据库中提取请求下载网页,然后存储“dmoz:items”中另一个redis数据库中的网页
slave从master的redis中取出要爬取的请求,下载网页后将网页的内容发回master的redis
重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,然后将master的redis中的“dmoz:items”数据库写入mongodb
在master中的reids中还有一个数据“dmoz:dupefilter”,用于存储抓取到的url的指纹(使用hash函数对url进行操作的结果),用于防止重复爬取。
4. 安装scrapy-redis框架
pip install scrapy-redis
5. 部署scrapy-redis5.1 在slave端Windows的settings.py文件末尾添加下面一行
REDIS_HOST = 'localhost' #master IP
REDIS_PORT = 6379
配置远程redis地址后,启动两个爬虫(启动爬虫没有顺序限制)
6 为爬虫添加配置信息
7 运行程序7.1 运行从机
scrapy runspider 文件名.py
无序打开
7.2 运行主机
lpush (redis_key) url #括号不用写
说明-这个命令在redis-cli中运行-redis_key是spider.py文件中redis_key的值-url开始爬取地址不带双引号
8 将数据导入mongodb
爬虫完成后,如果要将数据存储在mongodb中,需要修改master端的process_items.py文件,如下
9 将数据导入 MySQL
爬虫完成后,如果要将数据存储在mongodb中,需要修改master端的process_items.py文件,如下
推荐视频教程: