关于主从分布式

来源: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)后报错如下:http://szimg.mukewang.com/591bcf6a0001118915610311.jpg,好像是说redis中有不同类型的重名的key。请问老师我怎么让slave的爬虫消费master中的request呢?

2、是不是不同机器上配置了redis主从之后,master中相应的数据会同步到slave中,还是我的slave上的爬虫直接连接master上的redis进行消费呢?

写回答

2回答

白塔七元

提问者

2017-05-25

老师,我这里还是解决不了这个问题。

简单地说就是,我master抓了一堆url并生成了requests,我slave想要取这些requests,我该怎么取?

0
0

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就行了

0
5
bobby
回复
白塔七元
你加我qq说吧 442421039
2017-05-26
共5条回复

Scrapy打造搜索引擎 畅销4年的Python分布式爬虫课

带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎

5808 学习 · 6290 问题

查看课程