关于主从分布式
来源: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
相似问题