数据采集: scrapy-redis初始带参数请求

scrapy-redis官方demo中只有默认的get请求, 但是我们面对的网站多种多样, 有时候起始url就是post请求, 或者业务需要在get请求中加入很多后期要用到的参数, 此时可以重写make_requests_from_url方法来实现.

以下我会举例向:start_urls中放入一个json格式任务让爬虫去抓取

# -*- coding: utf-8 -*-

import json
import scrapy
from scrapy_redis.spiders import RedisSpider


class MysiteSpider(RedisSpider):
    name = 'mysite'

    def make_requests_from_url(self, data: str):
        '''
        data就是放入 mysite:start_urls 中的任务
        :param data: 
        :return: 
        '''
        req_data = json.loads(data)
        url = req_data['url']
        
        # 此处也可以改为post请求
        return scrapy.Request(
            url,
            meta={'req_data': req_data}
        )

    def parse(self, response):
        print(response.text)
        print(response.meta)

向队列mysite:start_urls放以下任务

lpush mysite:start_urls '{"url": "http://httpbin.org/ip", "test_key": 123456}'

输出结果如下, 可以看到我们在meta中的参数都在, 同时scrapy附加了其它的参数

{'req_data': {'url': 'http://httpbin.org/ip', 'test_key': 123456}, 'download_timeout': 180.0, 'download_slot': 'httpbin.org', 'download_latency': 0.3165419101715088}

以上就是一个简单的样例, 我们可以利用该方法解决很多问题, 比如

  • 初始post请求中需要携带参数
  • 初始请求中需要带cookie
  • 带业务字段供pipeline直接使用

你可能感兴趣的:(scrapy)