scrapy_redis分布式爬虫的创建流程及启动
# scrapy_redis分布式爬虫的创建流程及启动
分布式爬虫编写流程:
1.编写普通爬虫
1.创建项目
2.明确目标
3.创建爬虫
4.保存内容
2.改造成分布式爬虫
1.改造爬虫
1.导入scrapy-redis中的分布式爬虫类
2.继承类
3.注销start_url & allowed_domains
4.设置redis_key获取start_urls
5.设置__init__获取允许的域名
2.改造配置文件(settings)
copy配置参数
复制代码
#设置scrapy-redis
#1.启用调度将请求存储进redis
#from scrapy_redis.scheduler import Scheduler
SCHEDULER="scrapy_redis.scheduler.Scheduler"
#2.确保所有spider通过redis共享相同的重复过滤
# from scrapy_redis.dupefilter import RFPDupeFilter
DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"
#3.设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列(可以不设置)
SCHEDULER_PERSIST=True
#3.指定连接到Redis时要使用的主机和端口 目的是连接上redis数据库
REDIS_HOST="localhost"
REDIS_PORT=6379
#4.是否将数据存入Redis数据库的管道:
ITEM_PIPELINES = {
'jd.pipelines.JdPipeline': 300,
# 'jd.pipelines.JDSqlPipeline': 300,
#当开启此管道,该管道将会把数据存到Redis数据库中
'scrapy.redis.pipelines.RedisPipeline':400,
}
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# (1)编写普通爬虫:
以京东图书书籍信息爬取为例!毕竟,点击链接跳转详细讲解的博文: 爬取京东图书书籍信息! (opens new window)
# (2)改造成分布式爬虫:
使用场景:
1.数据量特别巨大
2.数据要求时间比较紧张
分布式的实现
scrapy—redis实现分布式
复制代码
1
2
3
4
5
6
7
2
3
4
5
6
7
改造只需5步,以及settings.py文件的改造!
# 第一:爬虫文件5步走!
# -*- coding: utf-8 -*-
import json
from selenium import webdriver
import scrapy
from ..items import JdItem
# 1.导入分布式爬虫类
from scrapy_redis.spiders import RedisSpider
# 2.继承分布式爬虫类
# class BookSpider(scrapy.Spider):
class BookSpider(RedisSpider):
name = 'book_test'
# 3.注销start_url和allowed_domains
# allowed_domains = ['book.jd.com']
# start_urls = ['https://book.jd.com/booksort.html']
# 4.设置redis-key
redis_key='jd'
# 5.设置__init__
def __init__(self, *args, **kwargs):
domain = kwargs.pop('domain', '')
self.allowed_domains = list(filter(None, domain.split(',')))
super().__init__(*args, **kwargs)
# 实例化一个浏览器对象(实例化一次) 开启无头模式
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--disable-gpu")
self.driver = webdriver.Chrome(options=options, executable_path="C:\my\Chrome_guge\chromedriver.exe")
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 第二:settings.py配置文件改造!
#设置scrapy-redis
#1.启用调度将请求存储进redis
#from scrapy_redis.scheduler import Scheduler
SCHEDULER="scrapy_redis.scheduler.Scheduler"
#2.确保所有spider通过redis共享相同的重复过滤
# from scrapy_redis.dupefilter import RFPDupeFilter
DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"
#3.设置当爬虫结束的时候是否保持redis数据库中的去重集合与任务队列(可以不设置)
SCHEDULER_PERSIST=True
#3.指定连接到Redis时要使用的主机和端口 目的是连接上redis数据库
REDIS_HOST="localhost"
REDIS_PORT=6379
#4.是否将数据存入Redis数据库的管道:
ITEM_PIPELINES = {
'jd.pipelines.JdPipeline': 300,
# 'jd.pipelines.JDSqlPipeline': 300,
#当开启此管道,该管道将会把数据存到Redis数据库中
'scrapy.redis.pipelines.RedisPipeline':400,
}
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
普通的scrapy框架下的爬虫已经改造成为分布式爬虫,然后将此项目再复制一个一模一样的;分别使用命令(scrapy crawl 项目名)运行,会发现两个项目终端都在等待;此时,我们打开Redis,向其中(lpush jd 起始url)即可正常运行两个爬虫项目;最后,我们会发现两个项目爬取的数据总和即为此次爬虫的需求数据!
# 🔆In The End!
# 👑有关于Me
个人简介:我是一个硬件出身的计算机爱好者,喜欢program,源于热爱,乐于分享技术与所见所闻所感所得。文章涉及Python,C,单片机,HTML/CSS/JavaScript及算法,数据结构等。
从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!
认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多技术文哦~
作者:孤寒者 链接:https://juejin.cn/post/7111519890904711199 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上次更新: 2023/04/05, 05:23:58