基于 Django2 和 Scrapy 的 IP 代理池

介绍

测试地址 GitHub 地址

请勿压测 影响正常使用则关闭测试地址。

效果展示

提供了各种 API 可供爬虫直接使用。

构建代理池不就是为了给爬虫使用吗!哈哈ヽ(°◇° )ノ

代理池 API

项目使用方式

下载项目到本地git clone https://github.com/LZC6244/ip_proxy_pool.git

或者进去 GitHub 下载

进到项目路径安装依赖pip install -r requirements.txt启动代理池程序pthon scheduler.py若在Ubuntu中使用,可将本代理池注册成服务。( 方法请看 这里 ) 等待几分钟即可在本地的 http://127.0.0.1:8000/ip_proxy/list/ 查看到代理池中的代理

爬虫使用本代理池

以 scrapy 为例,通过中间件方式使用。

非本地情况下,IP 地址更换为本项目实际 IP 地址即可。

在settings.py中添加DOWNLOADER_MIDDLEWARES = { ... yourproject.middlewares.yourmiddleware: 543, # example # yourproject.middlewares.ManageProxy: 543, } # 重试次数设置 (默认为2) RETRY_TIMES = 2 # 代理池相关 URL 配置 GET_CSRF = :8000/ip_proxy/get_csrf/ GET_PROXY = :8000/ip_proxy/get/ DEL_PROXY = :8000/ip_proxy/del/在middlewares.py中添加import requests from datetime import datetime from twisted.internet.error import TimeoutError from yourproject.settings import GET_CSRF, GET_PROXY, DEL_PROXY, RETRY_TIMES session = requests.session() csrf = session.get(GET_CSRF).json().get(csrf) def get_proxy(): return requests.get(GET_PROXY).json() def del_proxy(ip, port, verify_time): return session.post(DEL_PROXY, {csrfmiddlewaretoken: csrf, ip: ip, port: port, verify_time: verify_time}) class ManageProxy(object): def process_request(self, request, spider): if request.meta.get(retry_times) or request.meta.get(proxy): pass else: proxy_json = get_proxy() request.meta[proxy] = proxy_json.get(proxy) request.meta[ip_proxy] = proxy_json.get(ip) request.meta[port_proxy] = proxy_json.get(port) request.meta[verify_time] = datetime.strftime(datetime.now(), %Y-%m-%d %H:%M:%S) def process_exception(self, request, exception, spider): if all([isinstance(exception, TimeoutError), request.meta.get(retry_times) == RETRY_TIMES]): item = request.meta[item] verify_time = datetime.strftime(datetime.now(), %Y-%m-%d %H:%M:%S) del_proxy(item[ip], item[port], verify_time) # return request.copy()

项目拓展

本项目亦可自行拓展代理源网站,建议使用scrapy。

使用 scrapy 注意要点:

继承 BaseSpider使用 IpProxiesItem含有 ip port anonymit net_type ip_location (IP PORT 匿名度 类型 位置)字段( verify_time 验证时间会自行处理)请求参数设置 callback=self.verify_porxy, dont_filter=True

具体写法可以参考 这里 除 verify 和 base 之外的任意 spider

建议与改进

有什么问题或建议或比较好的免费代理网站推荐,欢迎提 issues

原创文章,转载请保留或注明出处!