下面我就详细讲解一下“scrapy-redis分布式爬虫的搭建过程(理论篇)"的完整攻略。
一、Scrapy-Redis分布式爬虫概述
Scrapy-Redis是以Redis作为分布式队列的Scrapy扩展,它实现了Scrapy的去重、任务调度等核心功能,同时通过Redis实现了分布式爬取等功能。具体来说,它使用Redis的List或Set结构实现爬虫任务队列和去重集合,通过Redis的Pub/Sub功能实现任务分发。利用Scrapy-Redis可以在多台机器上同时爬取同一组数据,大大提高爬取效率。
二、Scrapy-Redis分布式爬虫的搭建步骤
下面是Scrapy-Redis分布式爬虫的搭建步骤:
1. 安装Redis
Scrapy-Redis底层使用Redis作为消息队列、调度器、去重器等,因此需要先安装Redis。
2. 创建Scrapy项目
Scrapy-Redis是一个Scrapy的扩展,因此我们需要先创建一个Scrapy的项目。可以使用如下命令创建:
scrapy startproject myproject
这里将新建一个名为“myproject”的Scrapy项目,可以根据需求来命名。
3. 安装Scrapy-Redis
在Scrapy项目中安装Scrapy-Redis,可以使用如下命令:
pip install scrapy-redis
4. 修改settings.py文件
修改Scrapy项目中的settings.py文件,将其中的以下设置进行修改,以便Scrapy-Redis能够正常工作:
# 使用scrapy_redis的去重组件,不使用scrapy的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置使用scrapy-redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 在Redis中保持scrapy-redis用到的各个队列,从而允许暂停和恢复爬取
SCHEDULER_PERSIST = True
# 设置连接的Redis的主机IP和端口号
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
5. 定义Spider
定义自己的Spider类时,需将其从scrapy.Spider改为scrapy_redis.spiders.RedisSpider,以实现分布式爬取功能。如下:
import scrapy_redis
class MySpider(scrapy_redis.spiders.RedisSpider):
# your code here
6. 使用Redis爬取URL
使用Redis作为分布式队列,将待爬取的URL放入Redis中。这可以通过定义将待爬取的URL放入Redis的start_urls中,或在Spider中定义parse函数。
7. 运行Scrapy-Redis
由于Scrapy-Redis是分布式爬虫,因此需要在多个节点上运行。我们可以使用如下命令来启动一个分布式爬虫:
scrapy runspider spiders/xxx.py redis://localhost:6379
其中,"spider/xxx.py"为自己定义的Spider代码所在路径,"redis://localhost:6379"是Redis的URL。
三、Scrapy-Redis分布式爬虫的应用示例
示例一:爬取豆瓣电影Top250
以爬取豆瓣电影Top250为例,我们来演示Scrapy-Redis分布式爬虫的应用。首先,按照上述步骤创建一个Scrapy项目,并安装Scrapy-Redis。然后,按照如下示例代码编写一个简单的Spider:
import scrapy_redis
class DoubanSpider(scrapy_redis.spiders.RedisSpider):
# 设置爬虫名称
name = "douban"
# 设置允许的域名
allowed_domains = ["movie.douban.com"]
# 设置初始爬取的URL
start_urls = [
"https://movie.douban.com/top250"
]
# 使用自定义配置
custom_settings = {
'DOWNLOAD_DELAY': 1,
'COOKIES_ENABLED': False,
# 这里不启用pipeline,而使用Redis做为保存数据的管道
'ITEM_PIPELINES': {
'scrapy_redis.pipelines.RedisPipeline': 300
}
}
# def parse method here
在Spider的parse方法中,首先取出待爬取的URL,并使用yield发送给Scrapy去抓取。爬虫获取到的电影信息存放在scrapy.Item
对象中,并使用yield
语句返回给管道处理:
def parse(self, response):
# 模拟点击下一页
next_page = response.xpath('//*[@id="content"]/div/div[1]/div[2]/span[3]/a/@href')
if next_page:
url = response.urljoin(next_page[0].extract())
yield scrapy.Request(url=url, callback=self.parse)
# 解析所需信息
selector_list = response.xpath('//div[@class="hd"]')
item = DoubanMovieItem()
for selector in selector_list:
title = selector.xpath('a/span/text()').extract()[0]
link = selector.xpath('a/@href').extract()[0]
item['title'] = title
item['link'] = link
yield item
接下来,我们还需要对Scrapy项目的配置文件settings.py进行如下修改:
# 使用scrapy_redis的去重组件,不使用scrapy的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置使用scrapy-redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 在Redis中保持scrapy-redis用到的各个队列,从而允许暂停和恢复爬取
SCHEDULER_PERSIST = True
# 设置连接的Redis的主机IP和端口号
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
最后,在命令行中启动多个Scrapy爬虫应用实例,用于分布式爬取数据:
scrapy runspider spiders/douban.py redis://localhost:6379
示例二:爬取天堂图片网图片
以爬取天堂图片网图片为例,我们再次演示Scrapy-Redis分布式爬虫的应用。具体操作和步骤同上,结合示例代码进行理解。
首先按照上述步骤创建一个Scrapy项目,并安装Scrapy-Redis。然后,按照如下示例代码编写一个简单的Spider:
import scrapy_redis
class TPNSpider(scrapy_redis.spiders.RedisSpider):
# 设置爬虫名称
name = "tpn"
# 设置允许的域名
allowed_domains = ["ttpaihang.com"]
# 设置初始爬取的URL
start_urls = [
"http://www.ttpaihang.com/mm/1.html"
]
# 使用自定义配置
custom_settings = {
'DOWNLOAD_DELAY': 0.1,
'COOKIES_ENABLED': False,
# 这里不启用pipeline,而使用Redis做为保存数据的管道
'ITEM_PIPELINES': {
'scrapy_redis.pipelines.RedisPipeline': 300
}
}
# 解析HTML页面,并从页面中获取需要的信息
def parse(self, response):
# 爬虫逻辑代码
pass
在Spider的parse方法中,首先使用xpath语句获取所需信息并存放到scrapy.Item
对象中,然后通过yield
语句返回给管道处理:
def parse(self, response):
item = TPNSpiderItem()
img_list = response.xpath('//*[@id="content"]/div[3]/div/a/img')
for img in img_list:
title = img.xpath('@alt').extract_first()
link = img.xpath('@src').extract_first()
item['title'] = title
item['link'] = link
yield item
接下来,我们还需要再次对Scrapy项目的配置文件settings.py进行如下修改:
# 使用scrapy_redis的去重组件,不使用scrapy的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置使用scrapy-redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 在Redis中保持scrapy-redis用到的各个队列,从而允许暂停和恢复爬取
SCHEDULER_PERSIST = True
# 设置连接的Redis的主机IP和端口号
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
最后,在命令行中启动多个Scrapy爬虫应用实例,用于分布式爬取数据:
scrapy runspider spiders/tpn.py redis://localhost:6379
至此,本文完整地介绍了Scrapy-Redis分布式爬虫的搭建过程,并且配有豆瓣电影Top250和天堂图片网图片的完整示例。如果有不明白的地方,欢迎在留言区提出,我将尽快回复。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:scrapy-redis分布式爬虫的搭建过程(理论篇) - Python技术站