分布式
实现分布式的方式:scrapy+redis(scrapy结合着scrapy-redis组件)原生的scrapy框架是无法实现分布式的
什么是分布式
需要搭建一个分布式机群,然后让机群中的每一台电脑执行同一组程序,让其对同一组资源进行联合且分布的数据爬取。因调度器,管道无法被分布式机群共享所以原生架构scrapy无法实现分布式使用scrapy-redis组件可以给原生的scrapy框架提供共享管道和调度器实现分布式
pip install scrapy-redis
实现流程
创建工程
创建一个爬虫工程:scrapy startproject proName 进入工程创建一个基于CrawlSpider的爬虫文件 scrapy genspider -t crawl spiderName www.xxx.com 执行工程:scrapy crawl spiderName
1,修改爬虫文件
1.1 导包:from scrapy_redis.spiders import RedisCrawlSpider1.2 修改当前爬虫类的父类为:RedisCrawlSpider1.3 将start_url 替换成redis_key的属性,属性值为任意字符串
redis_key=‘xxxx’ #可以被共享的调度器队列的名称/稍后我们需要将一个起始url手动添加到redis_key表示的队列中 1.4 将数据解析的操作补充完成即可
fbs.py 爬虫源文件
import scrapy
from scrapy
.linkextractors
import LinkExtractor
from scrapy
.spiders
import CrawlSpider
, Rule
from scrapy_redis
.spiders
import RedisCrawlSpider
from fbsPro
.items
import FbsproItem
class FbsSpider(RedisCrawlSpider
):
name
= 'fbs'
redis_key
= 'sunQueue'
rules
= (
Rule
(LinkExtractor
(allow
=r
'id=1&page=\d+'), callback
='parse_item', follow
=True),
)
def parse_item(self
, response
):
li_list
= response
.xpath
('/html/body/div[2]/div[3]/ul[2]/li')
for li
in li_list
:
title
= li
.xpath
('./span[3]/a/text()').extract_first
()
item
= FbsproItem
()
item
['title']=title
yield item
2,对settings.py进行配置
指定调度器
DUPEFILTER_CLASS
= "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER
= "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST
= True
指定管道
ITEM_PIPELINES
= {
'scrapy_redis.pipelines.RedisPipeline': 400
}
指定redis
REDIS_HOST
= '127.0.0.1'
REDIS_PORT
= 6379
完整代码
BOT_NAME
= 'fbsPro'
SPIDER_MODULES
= ['fbsPro.spiders']
NEWSPIDER_MODULE
= 'fbsPro.spiders'
USER_AGENT
= 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
ROBOTSTXT_OBEY
= False
DUPEFILTER_CLASS
= "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER
= "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST
= True
ITEM_PIPELINES
= {
'scrapy_redis.pipelines.RedisPipeline': 400
}
REDIS_HOST
= '127.0.0.1'
REDIS_PORT
= 6379
CONCURRENT_REQUESTS
= 5
3,配置redis的配置文件redis.windows.conf
解除默认绑定
#bind 127.0.0.1 注释掉(第56行)
关闭保护模式
protected-mode no 把yes改成no(第75行)
redis运行时出错 Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
解决方法,依次输入以下命令
redis-cli.exeshutdownexitredis-server redis.windows.conf
启动redis服务和客户端
redis-server redis.windows.conf
redis-cli
5 执行scrapy工程
不要在配置文件中加入#LOG_LEVEL = ‘ERROR’工程启动后 程序回停留在listening位置,等待其实url的加入
6 想redis_key表示的队列中添加起始url
需要在redis的客户端执行如下指令:(调度器队列式存在与redis中)lpush sunQueue http://wz.sun0769.com/political/index/politicsNewest?id=1&page=
我们查看数据库可以看见爬取到的数据