免费代理服务器,基于Tornado和Scrapy,在本地搭建属于自己的代理池
特性:
- 持续爬取新的免费代理,检测可用后存入本地数据库
- 完全异步,支持高并发
- 易用的HTTP API
- 周期性检测代理可用性,自动更新
走过路过给个star…… _(:ι」∠)_
已经测试通过的环境:
- Archlinux; Python-3.6.5
- Debian(WSL, Raspbian); Python-3.5.3
代码暂不支持直接在Windows上运行,Windows用户请选择Docker方式部署或使用WSL……
选取下列方式之一安装部署本项目。 安装完成之后,通过API获取代理
最简单的安装部署方式是使用Docker,安装Docker后执行如下命令:
# 下载镜像
docker pull karmenzind/fp-server:stable
# 启动容器
# 如果在配置文件修改了端口,此处的`-p`也需要修改
docker run -itd --name fpserver -p 12345:12345 karmenzind/fp-server:stable
# 检查容器内部输出
docker logs -f fpserver
更改配置请查看下文
- 安装Redis数据库和
python>=3.5
(我用的是Python-3.6.5) - 克隆这个项目
- 安装所需的Python包
pip install -r requirements.txt
- 阅读配置介绍,根据需要修改
- 启动服务
python ./src/main.py
一般返回格式
{
"code": 0,
"msg": "ok",
"data": {}
}
- code: 事件状态(并非HTTP状态码), 0代表成功
- msg: 事件相关信息
- data: 返回数据
GET /api/proxy/
参数 | 必须(M)/ 非必须(O) |
详情 | 默认 |
---|---|---|---|
count | O | 获取的数目 | |
scheme | O | 协议。可选:HTTP HTTPS |
both* |
anonymity | O | 匿名效果。可选:transparent 透明, anonymous 匿名 |
both |
(TODO) sort_by_speed |
O | 排序: 1: 降序 0: 乱序 -1: 升序 |
0 |
- both: 包括所有类型,不分组
举例
- 获取10个HTTP匿名代理:
返回:
GET /api/proxy/?count=10&scheme=HTTP&anonymity=anonymous
{ "code": 0, "msg": "ok", "data": { "count": 9, "items": [ { "port": 2000, "ip": "xxx.xxx.xx.xxx", "scheme": "HTTP", "url": "http://xxx.xxx.xxx.xx:xxxx", "anonymity": "transparent" } ] } }
截图
POST /api/proxy/
参数 | 必须(M)/ 非必须(O) |
详情 | 默认 |
---|---|---|---|
ip | M | 例如 111.111.111.111 | |
port | M | 例如 12345 | |
scheme | M | 可选:HTTP HTTPS |
|
anonymity | O | 可选:transparent anonymous |
transparent |
need_auth | O | 可选: 0 1 | |
user | O | ||
password | O | ||
url | O | 根据给定scheme+ip+port声称 |
screenshot
查看服务状态。包含:
- 正在运行的爬虫
- Stored proxies
GET /api/status/
没有参数
screenshot
配置文件采用YAML格式,定义和默认值如下:
# 服务运行端口
HTTP_PORT: 12345
# 在终端打印输出,不写入文件
CONSOLE_OUTPUT: 1
# 日志设置
# dir和filename生效需要先设置CONSOLE_OUTPUT为0
LOG:
level: 'debug'
dir: './logs'
filename: 'fp-server.log'
REDIS:
host: '127.0.0.1'
port: 6379
db: 0
password:
# 本地要存储的代理总数
# 超过这个数目后,服务会停止爬取新的代理
# 根据你的需要来合理设置
PROXY_STORE_NUM: 500
# 设定周期,定时检查每个代理可用性
# 每个代理都会存储自己的最后检查时间,动态检查
PROXY_STORE_CHECK_SEC: 3600
- 使用Docker部署:
- 在本地新建目录,如
/x/config_dir
,在其中新建配置文件config.yml
,然后将docker-run命令修改如下:docker run -itd --name fpserver -p 12345:12345 -v "/x/config_dir":"/fps-config" karmenzind/fp-server:stable
- 外部
config.yml
的内容可以为上述配置项的子集,例如:其他配置项会自动采用内部配置PROXY_STORE_NUM: 100 LOG: level: 'info' PROXY_STORE_CHECK_SEC: 7200
- 如果要指定日志文件,不要修改
config.yml
中的LOG-dir
。在本地新建日志目录,如/x/log_dir
,结合上一步,修改docker-run命令为:docker run -itd --name fpserver -p 12345:12345 -v "/x/config_dir":"/fps_config" -v "/x/log_dir":"/fp_server/logs" karmenzind/fp-server:stable
- 没有必要修改内部端口。如果需要将HTTP端口映射到其他宿主机端口(如9999),将docker-run命令的
-p
参数修改为-p 9999:12345
- 如果需要在宿主机访问Redis数据库,可以给docker-run命令增加参数如
-p 6379:6379
- 在本地新建目录,如
- 手动方式部署:
- 直接修改项目内文件:
src/config/config.yml
- 直接修改项目内文件:
这个列表还在增加,欢迎贡献新的代理网站给我,我会将它加进项目里
目前支持:
- 西刺代理
- 快代理
- 云代理
- 66免费代理
- 无忧代理
- 3464
- coderbusy
- ip181
- iphai
- a2u
- coolproxy
- 万能代理
- 小幻代理 (figuring)
- 89免费代理(figuring)
-
baizhongsou(stop providing free proxies)
-
代理可用性如何?
fp-server在爬取代理时会先检测可用性(包括速度和匿名性),检测完毕后才会入库,不可用的直接抛弃,所以你获取到的都是相对可用的代理。
-
存储代理数目
PROXY_STORE_NUM
设置多少合适?有上限么?根据你自己的需求来合理设置。假如只是一个普通的爬虫项目,那么设置为300到500就可以了,因为fp-server会持续自检更新代理,数目过大没有意义。数目设置暂时没有上限,我在攒够一万个活动(可用的)代理后停止了测试,因为目前代理来源有限。根据项目关注度,我会持续增加代理来源。
-
怎么把它用到我的项目里?
见下文。
以下代码可以直接复制粘贴到你的项目。记得先检查修改配置。
有空我会写更多例子,你也可以告诉我你需要什么。
戳这里。
这是个用于给每个请求获取、增加代理的Scrapy中间件。把它复制到middlewares.py
,然后修改settings.py
里的DOWNLOADER_MIDDLEWARES
。
如果你需要维护一个Cookie池,给每个代理IP分配不同的CookieJar,可以参考我写的这个中间件。
欢迎大家反馈,这样我才有动力维护
如果有Bug或者建议,请直接创建issue