Request
简介
Request为feapder的下载器,基于requests进行了封装,因此支持requests的所有参数
我们可以直接调用框架中的Request发起请求,使用示例:
from feapder import Requestrequest = Request("https://www.baidu.com", data={}, params=None)response = request.get_response()print(response)
返回的response支持xpath、css等表达式,具体用法见Response
Request除了支持requests的所有参数外,更需要关心的是框架中支持的参数
参数详解
@summary: Request参数---------框架参数@param url: 待抓取url@param retry_times: 当前重试次数@param priority: 请求优先级 越小越优先 默认300@param parser_name: 回调函数所在的类名 默认为当前类@param callback: 回调函数 可以是函数 也可是函数名(如想跨类回调时,parser_name指定那个类名,callback指定那个类想回调的方法名即可)@param filter_repeat: 是否需要去重 (True/False) 当setting中的REQUEST_FILTER_ENABLE设置为True时该参数生效 默认True@param auto_request: 是否需要自动请求下载网页 默认是。设置为False时返回的response为空,需要自己去请求网页@param request_sync: 是否同步请求下载网页,默认异步。如果该请求url过期时间快,可设置为True,相当于yield的reqeust会立即响应,而不是去排队@param use_session: 是否使用session方式@param random_user_agent: 是否随机User-Agent (True/False) 当setting中的RANDOM_HEADERS设置为True时该参数生效 默认True@param download_midware: 下载中间件。默认为parser中的download_midware@param is_abandoned: 当发生异常时是否放弃重试 True/False. 默认False@param render: 是否用浏览器渲染@param render_time: 渲染时长,即打开网页等待指定时间后再获取源码--以下参数于requests参数使用方式一致@param method: 请求方式,如POST或GET,默认根据data值是否为空来判断@param params: 请求参数@param data: 请求body@param json: 请求json字符串,同 json.dumps(data)@param headers:@param cookies: 字典 或 CookieJar 对象@param files:@param auth:@param timeout: (浮点或元组)等待服务器数据的超时限制,是一个浮点数,或是一个(connect timeout, read timeout) 元组@param allow_redirects : Boolean. True 表示允许跟踪 POST/PUT/DELETE 方法的重定向@param proxies: 代理 {"http":"http://xxx", "https":"https://xxx"}@param verify: 为 True 时将会验证 SSL 证书@param stream: 如果为 False,将会立即下载响应内容@param cert:--@param **kwargs: 其他值: 如 Request(item=item) 则item可直接用 request.item 取出---------
举例说明:如果我们不想用内置的下载器,写法如下:
def start_requests(self):yield feapder.Request("https://www.baidu.com", auto_request=False)def parse(self, request, response):# response 为None, 需要自己去下载pass
方法详解
1. 发起请求,获取响应
def get_response(self, save_cached=False):"""获取带有selector功能的response@param save_cached: 保存缓存 方便调试时不用每次都重新下载@return:"""
save_cached 参数用于设置是否把响应缓存到redis,若为True, 需要配置redis连接信息。redis连接信息会读取setting.py文件,所以需要保证工作区间下有setting.py。
或者可以将连接信息设置为环境变量 以mac电脑为例
> vim ~/.bash_profileexport REDISDB_IP_PORTS='ip:port' # 多个地址用逗号隔开export REDISDB_USER_PASS='xxx'export REDISDB_DB='xxx' # 默认是0, 可不设置export REDISDB_SERVICE_NAME='xxx' # 用于redis的哨兵模式,单节点或集群模式可不设置
这样,当框架读取不到setting时,便会取环境变量里的值
2. 从缓存中取响应
def get_response_from_cached(self, save_cached=True):pass
用于从上面的缓存中取response。当缓存不存在时,会先下载,然后将响应存入缓存,之后再返回响应。缓存同样依赖redis,因此需要先配置好redis连接信息
3. 删除缓存
def del_response_cached(self)pass
4. 复制Request
def copy(self):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的配置,默认如下:
# 设置代理PROXY_EXTRACT_API = None # 代理提取API ,返回的代理分割符为\r\nPROXY_ENABLE = True# 随机headersRANDOM_HEADERS = True# requests 使用sessionUSE_SESSION = False
PROXY_EXTRACT_API 为代理的提取地址,如
PROXY_EXTRACT_API="http://xxxx"
返回的代理格式为:
ip:portip:portip:port
