利用ScrapyRedis实现海量数据分布式爬取(scrapy-redis)

2023-05-11 03:34:56 分布式 利用 海量

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中:

```python
def 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:

```python
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300,
}

通过以上步骤,我们即可实现利用ScrapyRedis实现的分布式爬取海量数据,可以非常有效的进行大量数据的抓取分析。

相关文章