Request
简介
Request为feapder的下载器,基于requests进行了封装,因此支持requests的所有参数
我们可以直接调用框架中的Request发起请求,使用示例:
from feapder import Request
request = 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_profile
export 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\n
PROXY_ENABLE = True
# 随机headers
RANDOM_HEADERS = True
# requests 使用session
USE_SESSION = False
PROXY_EXTRACT_API 为代理的提取地址,如
PROXY_EXTRACT_API="http://xxxx"
返回的代理格式为:
ip:port
ip:port
ip:port