scrapy-redis
官方demo中只有默认的get请求, 但是我们面对的网站多种多样, 有时候起始url就是post请求, 或者业务需要在get请求中加入很多后期要用到的参数, 此时可以重写make_requests_from_url
方法来实现.
以下我会举例向<spider>: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直接使用