NO.0
一位大佬的Github:01ly/FooProxy用法写得很详细!!!稳健高效的评分制-针对性- IP代理池 + API服务,可以自己插入采集器进行代理IP的爬取,针对你的爬虫的一个或多个目标网站分别生成有效的IP代理数据库,支持MongoDB 4.0 使用 Python3.7———感觉很棒!———在大佬的代码基础上,在custom目录下的custom.py文件中,自己又扩展了5个代理爬虫,感觉很稳!Github :https://github.com/Ingram7/ProxyPoolScrapy中使用
API调用
root = :5000 # 请求代理 直接返回一个高匿代理 root+/proxy如果使用这种API
在middlewares.py中
import json import requests import logging class ProxyMiddleware(object): def __init__(self, proxy_url): self.logger = logging.getLogger(__name__) self.proxy_url = proxy_url def get_random_proxy(self): try: response = requests.get(self.proxy_url) if response.status_code == 200: p = json.loads(response.text) proxy = {}:{}.format(p.get(ip), p.get(port)) print(get proxy ...) ip = {"http": "http://" + proxy, "https": "https://" + proxy} r = requests.get("", proxies=ip, timeout=4) if r.status_code == 200: return proxy except: print(get proxy again ...) return self.get_random_proxy() def process_request(self, request, spider): proxy = self.get_random_proxy() if proxy: self.logger.debug(====== + 使用代理+ str(proxy) + "======") request.meta[proxy] = https://{proxy}.format(proxy=proxy) def process_response(self, request, response, spider): if response.status != 200: print("again response ip:") request.meta[proxy] = https://{proxy}.format(proxy=self.get_random_proxy()) return request return response @classmethod def from_crawler(cls, crawler): settings = crawler.settings return cls( proxy_url=settings.get(PROXY_URL) )中间件写好以后,需要去settings.py中启动:
PROXY_URL = :5000/proxy DOWNLOADER_MIDDLEWARES = { XXXXXX.middlewares.ProxyMiddleware: 543, scrapy.downloadermiddleware.httpproxy.HttpProxyMiddleware: None }原则上还需禁用系统自带的代理中间件(HttpProxyMiddleware)这里禁用了当然不禁用也可:注意这里的优先级设置,要使得我们自定义的ProxyMiddleware 生效,它在内置的HttpProxyMiddleware 之前调用;内置的HttpProxyMiddleware 的优先级为750 ,所以设置一个比750 小的数字即可不禁用
调用另外一种API
root = :5000 # 请求代理 返回所有满足条件的目标库IP代理数据 条件可自己在APIserver的路由函数中编辑 root+/proxy/target/<string:domain>/<string:suffix>如果使用这种API,则返回所有满足条件的目标库IP代理数据,不是随机的一个
上文代码改为p = random.choice(json.loads(response.text))
免费代理极其容易失效,如果有一定开发预算的话,建议购买专业代理机构的代理服务,高速而稳定比如 阿布云代理 (新账号免费申请过短暂的几小时感觉挺爽的)在middlewares.py中添加:
# 阿布云 ip代理 import base64 # 代理服务器 proxyServer = ":9020" # 代理隧道验证信息 proxyUser = "HF2N901MA0******" proxyPass = "18A4C***********" proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8") class ProxyMiddleware(object): def process_request(self, request, spider): request.meta["proxy"] = proxyServer request.headers["Proxy-Authorization"] = proxyAuth