利用ScrapyRedis实现海量数据分布式爬取(scrapy-redis)
ScrapyRedis是一个基于scrapy爬虫框架的分布式爬取项目,使用了有效的去重和调度机制,能够有效的在分布式的服务器中抓取海量的网页数据。今天就来看看如何通过ScrapyRedis框架来实现分布式爬取海量数据吧。
1.安装ScrapyRedis
我们需要利用pip安装ScrapyRedis,可以执行以下命令安装:
“`text
$ pip install scrapy-redis
2.创建项目
安装完ScrapyRedis后,我们可以利用Scrapy官方开发框架,创建一个项目:
```text $ scrapy startproject myscrapy
3.修改配置文件
修改项目配置文件settings.py,在文件中分别增加SCHEDULER,SCHEDULER_PERSIST,DUPEFILTER_CLASS设置,如下图:
“`python
SCHEDULER=”scrapy_redis.scheduler.Scheduler”
SCHEDULER_PERSIST=True
DUPEFILTER_CLASS=”scrapy_redis.dupefilter.RFPDupeFilter”
4.创建items
接下来,我们要创建items,用于提取我们关注的内容,首先在项目的items.py文件中定义item需要的字段,然后定义一个Spider,通过Spider中的parse()将抓取的数据提取出来,然后保存到item中:
```python# -*- coding: utf-8 -*-
# Define here the models for your scraped items#
# See documentation in:# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class MyscrapyItem(scrapy.Item):
title = scrapy.Field() # 标题 link = scrapy.Field()
desc = scrapy.Field() ...
5.Spider爬取
接下来,我们写一个Spider来进行爬取,在爬虫文件中我们要导入RedisSpider类,然后重写start_requests() 这个方法,这个方法可以往数据库里添加初始的url,同时添加callback方法把url放入返回的数据当中:
“`python
# -*- coding: utf-8 -*-
import scrapy
from scrapy_redis.spiders import RedisSpider
class MySpider(RedisSpider):
name = ‘myspider’
redis_key = ‘myspider:start_urls’
# start_urls = [”]
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, callback=self.parse)
接下来我们可以利用requests把url传给解析函数,解析页面,并用for循环把抓取到的数据放入items中:
```pythondef parse(self,response):
items = MyscrapyItem()
for info in response.xpath('//div[@class="mn"]'): item['title'] = info.xpath('h1/text()').extract()[0]
item['link'] = info.xpath('a/@href').extract()[0] item['desc'] = info.xpath('p/text()').extract()[0]
yield item
使用ScrapyRedis框架的话就要设置好Redis的服务器地址和端口,以及使用的数据库号,这些信息在项目的setting.py文件中设置:
“`python
# 设置Redis的服务器地址和端口
REDIS_HOST = ‘127.0.0.1’
REDIS_PORT = 6379
# 设置使用的数据库号
REDIS_DB = 0
最后记得在settings.py文件里开启管道,让数据可以直接插入到我们指定的数据库中去Asynchronous Pipeline:
```pythonITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300,}
通过以上步骤,我们即可实现利用ScrapyRedis实现的分布式爬取海量数据,可以非常有效的进行大量数据的抓取分析。