代理使用说明

代理使用有三种方式

  1. 使用框架内置代理池
  2. 自定义代理池
  3. 请求中直接指定

方式1. 使用框架内置代理池

配置代理

在配置文件中配置代理提取接口

  1. # 设置代理
  2. PROXY_EXTRACT_API = None # 代理提取API ,返回的代理分割符为\r\n
  3. PROXY_ENABLE = True
  4. PROXY_MAX_FAILED_TIMES = 5 # 代理最大失败次数,超过则不使用,自动删除

要求API返回的代理格式为使用 /r/n 分隔:

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

这样feapder在请求时会自动随机使用上面的代理请求了

管理代理

  1. 删除代理(默认是请求异常连续5次,再删除代理)

    例如在发生异常时删除代理

    1. import feapder
    2. class TestProxy(feapder.AirSpider):
    3. def start_requests(self):
    4. yield feapder.Request("https://www.baidu.com")
    5. def parse(self, request, response):
    6. print(response)
    7. def exception_request(self, request, response):
    8. request.del_proxy()

方式2. 自定义代理池

  1. 编写代理池:例如在你的项目下创建个my_proxypool.py,实现下面的函数

    1. from feapder.network.proxy_pool import BaseProxyPool
    2. class MyProxyPool(BaseProxyPool):
    3. def get_proxy(self):
    4. """
    5. 获取代理
    6. Returns:
    7. {"http": "xxx", "https": "xxx"}
    8. """
    9. pass
    10. def del_proxy(self, proxy):
    11. """
    12. @summary: 删除代理
    13. ---------
    14. @param proxy: xxx
    15. """
    16. pass
  2. 修改setting的代理配置

    1. PROXY_POOL = "my_proxypool.MyProxyPool" # 代理池

    将编写好的代理池配置进来,值为类的模块路径,需要指定到具体的类名

方式3. 不使用代理池,直接给请求指定代理

直接给request.proxies赋值即可,例如在下载中间件里使用

  1. import feapder
  2. class TestProxy(feapder.AirSpider):
  3. def start_requests(self):
  4. yield feapder.Request("https://www.baidu.com")
  5. def download_midware(self, request):
  6. # 这里使用代理使用即可
  7. request.proxies = {"https": "https://ip:port", "http": "http://ip:port"}
  8. return request
  9. def parse(self, request, response):
  10. print(response)