Request
Request
是对请求参数的封装,主要是给downloader下载器的使用
主要参数
- url:请求的资源链接
- method:请求的方法,
get
或者post
,默认get
- headers:请求头
- callback:支持两种方式传入,可以是函数名,也可以是函数,最终存储的是函数名称字符串
- meta:跨请求传递数据
- request_config:请求配置
- params: params参数
- data: post请求data参数
- json: post请求json参数
- dont_filter:是否去重,默认是去重,如果不需要去重可以设置为False
- priority: 优先级,优先级越大,请求越优先
- session:http请求session
- client_kwargs:会话参数,例如
- http_kwargs:请求的其他参数
其中session不进行序列化存储到队列中,也就是初始化时设置也是无效的,会被抛弃。 只有从爬虫队列取出后,进行设置才有效,例如在中间件和重试回调中设置session。
另外其他请求的参数直接传即可
序列化问题
默认使用的序列化是ujson,进行存储的是str,但是当request参数存在一些特殊符号时,使用redis队列会出现错误。 此时可以选择pickle进行序列化,另外使用pickle也可以节省内存,只需要设置 SERIALIZATION="pickle"
去重指纹
因为有post方法,所以不能简单把url去重,去重指纹的生成,主要是方法类型(get/post)+url(包含query string)+请求体data+请求体json
def request_fingerprint(request):
fp = hashlib.md5()
fp.update(to_bytes(request.method))
fp.update(to_bytes(request.request_url))
fp.update(to_bytes(str(request.data)) or b'')
fp.update(to_bytes(str(request.json)) or b'')
return fp.hexdigest()
例子
request = Request(url="https://httpbin.org/get", callback="parse", timeout=5)
request.proxy = "http://127.0.0.1:8888"
request.timeout = 3
request.set("verify", False)
print(request.http_kwargs)