关于主从分布式
来源:10-4 scrapy-redis编写分布式爬虫代码

白塔七元
2017-05-17
# -*- coding: utf-8 -*- import scrapy from jd_scrapy_redis.items import JdCategoryUrlsItem from scrapy_redis.spiders import RedisSpider from urllib import parse from tools.common import get_md5 class JDUrlsSpider(RedisSpider): name = 'jd_category_urls' allowed_domains = ['jd.com'] redis_key = 'jd_category_urls:start_urls' def parse(self, response): # 解析总类目页面,获取各类目url并存储到redis中 jd_category_item = JdCategoryUrlsItem() category_urls = response.xpath('//div[@class="mc"]//dd//em//a//@href').extract() for url in category_urls: category_url = parse.urljoin(response.url, url) jd_category_item['category_url'] = category_url jd_category_item['category_url_object_id'] = get_md5(category_url) yield jd_category_item yield scrapy.Request(url=category_url)
# -*- coding: utf-8 -*- import scrapy from scrapy_redis.spiders import RedisSpider from urllib import parse from jd_scrapy_redis.items import JdDetailUrlsItem from tools.common import get_md5 class JdDetailUrlsSpider(RedisSpider): name = 'jd_detail_urls' allowed_domains = ['jd.com'] redis_key = 'jd_category_urls:requests' def parse(self, response): jd_detail_item = JdDetailUrlsItem() detail_urls = response.xpath('//div[@class="gl-i-wrap j-sku-item"]/div[@class="p-img"]/a/@href').extract() for url in detail_urls: detail_url = parse.urljoin(response.url, url) print('detail_url:' + detail_url) jd_detail_item['detail_url'] = detail_url jd_detail_item['detail_url_object_id'] = get_md5(detail_url) jd_detail_item['referer_url'] = response.url # 将每个图书类别url发送请求 yield jd_detail_item yield scrapy.Request(detail_url) pn_next = response.xpath('//a[@class="pn-next"]//@href').extract() if len(pn_next) != 0: next_url = parse.urljoin(response.url, pn_next[0]) # 依然是图书类别url,下一页 print('next_url:' + next_url) yield scrapy.Request(next_url, callback=self.parse)
1、第一个爬虫是爬取分类url并构造成request,第二个爬虫的redis-key直接使用第一个爬虫生成的requests(zset)后报错如下:,好像是说redis中有不同类型的重名的key。请问老师我怎么让slave的爬虫消费master中的request呢?
2、是不是不同机器上配置了redis主从之后,master中相应的数据会同步到slave中,还是我的slave上的爬虫直接连接master上的redis进行消费呢?
2回答
-
白塔七元
提问者
2017-05-25
老师,我这里还是解决不了这个问题。
简单地说就是,我master抓了一堆url并生成了requests,我slave想要取这些requests,我该怎么取?
00 -
bobby
2017-05-18
1.
:数据库中有一个key是usrInfo的数据存储的是Hash类型的,但是你使用jedis执行数据
操作的时候却使用了非Hash的操作方法,比如Sorted Sets里的方法。此时就会报
ERR Operation against a key holding the wrong kind of value这个错误!
你需要使用redis-cli确定一下你这两个key的类型是不是正确
2. 实际上真正在部署分布式爬虫的时候最好单独使用一台服务器部署redis专门用于部署各个地方爬虫的集中管理信息, 不过redis也可以放在任何和爬虫相同的服务器 这个没有关系, 你只需要知道不管分布式爬虫部署在哪里, 最终所有爬虫都是从同一个redis中获取爬取的列表就行了, 默认redis是主从分分离的, 就意味着你不能向从redis中写入数据, 只能读。写的话写入主的redis就行了
052017-05-26
相似问题