Request

简介

Request为feapder的下载器,基于requests进行了封装,因此支持requests的所有参数

我们可以直接调用框架中的Request发起请求,使用示例:

  1. from feapder import Request
  2. request = Request("https://www.baidu.com", data={}, params=None)
  3. response = request.get_response()
  4. print(response)

返回的response支持xpath、css等表达式,具体用法见Response

Request除了支持requests的所有参数外,更需要关心的是框架中支持的参数

参数详解

  1. @summary: Request参数
  2. ---------
  3. 框架参数
  4. @param url: 待抓取url
  5. @param retry_times: 当前重试次数
  6. @param priority: 请求优先级 越小越优先 默认300
  7. @param parser_name: 回调函数所在的类名 默认为当前类
  8. @param callback: 回调函数 可以是函数 也可是函数名(如想跨类回调时,parser_name指定那个类名,callback指定那个类想回调的方法名即可)
  9. @param filter_repeat: 是否需要去重 (True/False) setting中的REQUEST_FILTER_ENABLE设置为True时该参数生效 默认True
  10. @param auto_request: 是否需要自动请求下载网页 默认是。设置为False时返回的response为空,需要自己去请求网页
  11. @param request_sync: 是否同步请求下载网页,默认异步。如果该请求url过期时间快,可设置为True,相当于yieldreqeust会立即响应,而不是去排队
  12. @param use_session: 是否使用session方式
  13. @param random_user_agent: 是否随机User-Agent (True/False) setting中的RANDOM_HEADERS设置为True时该参数生效 默认True
  14. @param download_midware: 下载中间件。默认为parser中的download_midware
  15. @param is_abandoned: 当发生异常时是否放弃重试 True/False. 默认False
  16. @param render: 是否用浏览器渲染
  17. @param render_time: 渲染时长,即打开网页等待指定时间后再获取源码
  18. --
  19. 以下参数于requests参数使用方式一致
  20. @param method: 请求方式,如POSTGET,默认根据data值是否为空来判断
  21. @param params: 请求参数
  22. @param data: 请求body
  23. @param json: 请求json字符串,同 json.dumps(data)
  24. @param headers:
  25. @param cookies: 字典 CookieJar 对象
  26. @param files:
  27. @param auth:
  28. @param timeout: (浮点或元组)等待服务器数据的超时限制,是一个浮点数,或是一个(connect timeout, read timeout) 元组
  29. @param allow_redirects : Boolean. True 表示允许跟踪 POST/PUT/DELETE 方法的重定向
  30. @param proxies: 代理 {"http":"http://xxx", "https":"https://xxx"}
  31. @param verify: True 时将会验证 SSL 证书
  32. @param stream: 如果为 False,将会立即下载响应内容
  33. @param cert:
  34. --
  35. @param **kwargs: 其他值: Request(item=item) item可直接用 request.item 取出
  36. ---------

举例说明:如果我们不想用内置的下载器,写法如下:

  1. def start_requests(self):
  2. yield feapder.Request("https://www.baidu.com", auto_request=False)
  3. def parse(self, request, response):
  4. # response 为None, 需要自己去下载
  5. pass

方法详解

1. 发起请求,获取响应

  1. def get_response(self, save_cached=False):
  2. """
  3. 获取带有selector功能的response
  4. @param save_cached: 保存缓存 方便调试时不用每次都重新下载
  5. @return:
  6. """

save_cached 参数用于设置是否把响应缓存到redis,若为True, 需要配置redis连接信息。redis连接信息会读取setting.py文件,所以需要保证工作区间下有setting.py。

或者可以将连接信息设置为环境变量 以mac电脑为例

  1. > vim ~/.bash_profile
  2. export REDISDB_IP_PORTS='ip:port' # 多个地址用逗号隔开
  3. export REDISDB_USER_PASS='xxx'
  4. export REDISDB_DB='xxx' # 默认是0, 可不设置
  5. export REDISDB_SERVICE_NAME='xxx' # 用于redis的哨兵模式,单节点或集群模式可不设置

这样,当框架读取不到setting时,便会取环境变量里的值

2. 从缓存中取响应

  1. def get_response_from_cached(self, save_cached=True):
  2. pass

用于从上面的缓存中取response。当缓存不存在时,会先下载,然后将响应存入缓存,之后再返回响应。缓存同样依赖redis,因此需要先配置好redis连接信息

3. 删除缓存

  1. def del_response_cached(self)
  2. pass

4. 复制Request

  1. def copy(self):
  2. pass

缓存机制

1. 缓存有效期

缓存使用redis的str结构存储,每条缓存对应一个key,默认有效期20分钟,可以通过 Request.cached_expire_time=过期时间来设置

2. 缓存key

默认的key为 response_cached:test:request指纹

可通过Request.cached_redis_key设置,设置后为 response_cached:自定义的key:request指纹

代理及UserAgent

代理及UA的设置优先取传递的参数,若参数没指定,则依赖setting.py的配置,默认如下:

  1. # 设置代理
  2. PROXY_EXTRACT_API = None # 代理提取API ,返回的代理分割符为\r\n
  3. PROXY_ENABLE = True
  4. # 随机headers
  5. RANDOM_HEADERS = True
  6. # requests 使用session
  7. USE_SESSION = False

PROXY_EXTRACT_API 为代理的提取地址,如

  1. PROXY_EXTRACT_API="http://xxxx"

返回的代理格式为:

  1. ip:port
  2. ip:port
  3. ip:port