# 分布式概念:使用多台机器搭建一个分布式机群,在分布式机群中共同运行同一组程序
# 让其对同一个网络资源进行联合数据爬取
# 原生的scrapy框架时无法实现分布式 :1、调度器无法被分布式机群共享 2、管道无法被共享
# 如何实现分布式?使用scrapy结合着scrapy-redis组件实现分布式
# scrapy-redis组件作用:给scrapy提供可以被共享的管道和调度器 pip install scrapy_redis
# 实现流程 1、创建工程
# 2、cd工程
# 3、创建爬虫文件——基于crawlspider的爬虫文件
# 4 修改爬虫文件 allowed_domains注释掉
# 导包 修改当前爬虫类的父类 class FbSpider(RedisCrawlSpider)
# 注释掉start_urls 添加一个新属性 redis_key='sunQueue'可以被共享的调度器队列的名称
# 基于常规的操作
# 5修改配置文件(setting.py)
# 指定调度器
# DUPEFITER_CLASS='scrapy redis.dupefilter.RFPDupeFilter'
# SCHEDULER='scrapy redis.scheduler.Scheduler'
# SCHEDULER_PERSIST=True
# 指定管道
# ITEM_PIPELINES={'scrapy_redis.pipelines.RedisPipeline':400
#指定redis服务器
# REDIS_HOST=''
# REDIS_PORT=
# 6、对redis的配置文件进行配置(redis.windows.conf)
# 取消默认绑定 将bind127.0.0.1注释
# 关闭保护模式 protected-mode yes:将yes改为no
# 7、启动redis的服务器和客户端
# -redis服务端的启动:在终端里执行:redis-server.exe redis.window.conf
# 启动客户端
# 8、执行程序
# 在日志输出可以看出日志hang住了,为啥会hang住,因为在等待起始的url
# 9、向调度器的队列中扔入一个起始的url:
# -在redis-cli:lpush sunQueue www.123.com
# 10、redis-cli:
# -proName:item命名的数据结构
from rom scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider,Rule
from scrapy redis.spider import RedisCrawlSpider
class SunSpider(CrawlSpider):
name='sun'
# start_urls=['']
redis_key='sunQueue'
link=LinkExtractor(allow=r'type=4&page=\d+')
rules=(Rule(link,callback='parse_item',follow=True),)
def parse_item(self,response):
tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
for tr in tr_list:
title=tr.xpath('./td[2]/a[2]/text()').extract_first()
# 使用链接提取器进行详情页的提取
item=CrawlproItem()
item['title']=title
yield item
class CrawlproItem(scray.Spider):
title=scrapy.Field()