Skip to content

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)