欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scrapy_redis中以set存入url和附带内容-写给自己看爬虫系列7

程序员文章站 2022-05-23 10:34:11
...

前言

需求:初始化url除了url外还有其他字段信息需要附带上,以便item输出时继承这些信息
思路:改写scrapy_redis中的next_request类,和改写将url存入redis的脚本。将需要附带的信息和url在next_request处理中进行分离,将附带的信息放入meta中从而实现继承信息。

spider中的 next_requests

scrapy_redis通过next_requests来制造requests,因此对其读取redis部分进行改造,另外使用Request来构造请求。读取出来的内容用json来转化。

from scrapy.http import Request
from scrapy.http import FormRequest
from scrapy_redis.spiders import RedisSpider
from scrapy_redis import connection
from scrapy import signals

class House_detail_spider(RedisSpider):
    
    name = 'ningbohdetailsd'

    allowed_domains = ['http://newhouse.cnnbfdc.com/']

    redis_key ='ningbohdetailsd:start_urls'

    a = redis.Redis("127.0.0.1","6379")  #redis地址,因为读取默认地址出现错误,所以在spider中链接好
    
    def next_requests(self):

        found = 0

        while found < self.redis_batch_size:
            data_raw =self.a.spop(self.redis_key) #从redis中取出内容

            if not data_raw:
                break
          
            data = json.loads(data_raw)    #存入redis的内容是json,需要转化
            
            if "source_url" not in data:
                break
            req = Request(url=data['source_url'],
                            method='GET',
                            dont_filter=True,
                            meta=data['meta'])  #发出请求
            if req:
                yield req
                found += 1
            else:
                self.logger.debug("Request not made from data: %s", data)

        if found:
            self.logger.debug("Read %s requests from '%s'", found, self.redis_key)
将种子url传入redis的脚本

使用添加集合的方式来存入url和对应信息

    a = redis.Redis("127.0.0.1","6379")
    ddd={
            "source_url":"url"
            "meta":
                    {
                    "building_name":'12345',
                    "project_name" :'12345',
                    "project_uuid" :'12345',
                    }
            }
            
    ddd2 =json.dumps(ddd)      #将字典转化为json
    
    a.sadd('ningbohdetailsd:start_urls',ddd2)   #存入内容