- 版本:
- 本项目是一个使用 Django 作为接口后端,scrapy 作为爬虫的一个代理 IP 池。
- 数据库:sqlite 免去安装数据库烦恼(亦可使用其他 Django 支持的数据库,更改 Django settings 文件即可)
- 启动程序后,首先会启动 Django 服务器,然后进行第一次的代理爬取,稍等几分钟即可看见代理陆续入库。
- 测试地址:测试地址 请勿压测 影响正常使用则关闭测试地址
- 高匿:服务器不知道我们使用了代理。
- 普匿:服务器知道我们使用了代理,但一般无法查出我们的IP地址。
- 透明:服务器知道我们使用了代理,且能查出你的IP地址。(本 IP 池不收集)
代理匿名度取自代理源网站,本项目不做判断!
- 不计算响应时间,因为 scrapy 是
异步
发送请求的
- 每
4
个小时从代理网站爬取一次代理 - 每
2
个小时验证一次代理池中的全部代理 - 若时间间隔到了
爬取/验证
代理未完成,则会等待其完成再进行爬取/验证
代理动作 - 爬取到新的代理时
priority
设为2
- 代理验证成功时
priority
加1
- 代理验证失败时
priority
减失败次数,priority
小于0
则删除该代理
- 每天删除一次两天前的日志文件,避免积累过多
- 时间以启动本项目时间为基准
在本项目路径下执行命令:
pip install -r requirements.txt
在 ip_proxy_site
路径下执行
python manage.py makemigrations ip_proxy
python manage.py migrate
在本项目路径下执行命令:
pthon scheduler.py
若是将本项目部署在云主机之类的,通过 ssh
操控
为了避免 session
断开则程序中断,可以使用以下命令:
nohup python scheduler.py &
- 若在
Ubuntu
中使用,可将本代理池注册成服务。 - 方法请看这里
以 scrapy 为例。
非本地情况下,IP 地址更换为本项目实际 IP 地址即可。
- 在
settings.py
中添加以下:
DOWNLOADER_MIDDLEWARES = {
...
'yourproject.middlewares.yourmiddleware': 543,
# example
# 'yourproject.middlewares.ManageProxy': 543,
}
# 重试次数设置 (默认为2)
RETRY_TIMES = 2
# 代理池相关 URL 配置
GET_CSRF = 'http://127.0.0.1:8000/ip_proxy/get_csrf/'
GET_PROXY = 'http://127.0.0.1:8000/ip_proxy/get/'
DEL_PROXY = 'http://127.0.0.1:8000/ip_proxy/del/'
- 在
middlewares.py
中添加以下:
import requests
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')
可自行拓展代理源网站,建议使用 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
Path | Mmethod | Description | Return | Arguments |
---|---|---|---|---|
get/ | get | 从代理池随机返回一个(上次验证可用)代理 | JsonResponse | None |
update/ | post | 更新代理,不存在则插入,存在则 priority +1 和 更新验证时间 | HttpResponse | ip,port,verify_time,[anonymity,net_type,ip_location] |
del/ | post | 代理 priority - 已验证失败次数,若减法过后 priority<=0 则从库中移除该代理 | HttpResponse | ip,port,verify_time |
get_csrf/ | post | 获取 csrf 信息,用于验证,无该信息则访问 api 失败 | JsonResponse | None |
list/ | post | 分页展示所有的代理 | HttpResponse | page |
admin/ | get | 后台入口 | HttpResponse | None |
后台已创建管理员账户 admin
更改密码可以在本项目的 ip_proxy_site
路径下使用以下命令:
python manage.py changepassword username(admin)
或者创建一个新的管理员:
python manage.py createsuperuser
网站名称 | 地址 |
---|---|
快代理 | 传送门 |
免费代理IP库 | 传送门 |
西刺代理 | 传送门 |
云代理 | 传送门(高匿)传送门(普匿) |
- 增加更多代理源网站
see TODO_HISTORY