77
88简易高效的代理池,提供如下功能:
99
10- * 定时抓取免费代理网站,简易可扩展。
11- * 使用 Redis 对代理进行存储并对代理可用性进行排序。
12- * 定时测试和筛选,剔除不可用代理,留下可用代理。
13- * 提供代理 API,随机取用测试通过的可用代理。
10+ - 定时抓取免费代理网站,简易可扩展。
11+ - 使用 Redis 对代理进行存储并对代理可用性进行排序。
12+ - 定时测试和筛选,剔除不可用代理,留下可用代理。
13+ - 提供代理 API,随机取用测试通过的可用代理。
1414
1515代理池原理解析可见「[ 如何搭建一个高效的代理池] ( https://cuiqingcai.com/7048.html ) 」,建议使用之前阅读。
1616
@@ -33,17 +33,17 @@ cd ProxyPool
3333
3434如果使用 Docker,则需要安装如下环境:
3535
36- * Docker
37- * Docker-Compose
36+ - Docker
37+ - Docker-Compose
3838
3939安装方法自行搜索即可。
4040
4141### 常规方式
4242
4343常规方式要求有 Python 环境、Redis 环境,具体要求如下:
4444
45- * Python>=3.6
46- * Redis
45+ - Python>=3.6
46+ - Redis
4747
4848## Docker 运行
4949
@@ -72,6 +72,12 @@ proxypool | 2020-02-19 17:09:46,596 INFO success: tester entered RUNNING stat
7272
7373这时候访问 [ http://localhost:5555/random ] ( http://localhost:5555/random ) 即可获取一个随机可用代理。
7474
75+ 当然你也可以选择自己 Build,直接运行如下命令即可:
76+
77+ ```
78+ docker-compose -f build.yml up
79+ ```
80+
7581如果下载速度特别慢,可以自行修改 Dockerfile,修改:
7682
7783``` diff
@@ -118,7 +124,7 @@ export REDIS_CONNECTION_STRING='redis://@host:port/db'
118124
119125### 安装依赖包
120126
121- 这里强烈推荐使用 [ Conda] ( https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-with-commands )
127+ 这里强烈推荐使用 [ Conda] ( https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#creating-an-environment-with-commands )
122128或 [ virtualenv] ( https://virtualenv.pypa.io/en/latest/user_guide.html ) 创建虚拟环境,Python 版本不低于 3.6。
123129
124130然后 pip 安装依赖即可:
@@ -198,15 +204,15 @@ if __name__ == '__main__':
198204```
199205get random proxy 116.196.115.209:8080
200206{
201- "args": {},
207+ "args": {},
202208 "headers": {
203- "Accept": "*/*",
204- "Accept-Encoding": "gzip, deflate",
205- "Host": "httpbin.org",
206- "User-Agent": "python-requests/2.22.0",
209+ "Accept": "*/*",
210+ "Accept-Encoding": "gzip, deflate",
211+ "Host": "httpbin.org",
212+ "User-Agent": "python-requests/2.22.0",
207213 "X-Amzn-Trace-Id": "Root=1-5e4d7140-662d9053c0a2e513c7278364"
208- },
209- "origin": "116.196.115.209",
214+ },
215+ "origin": "116.196.115.209",
210216 "url": "https://httpbin.org/get"
211217}
212218```
@@ -219,41 +225,41 @@ get random proxy 116.196.115.209:8080
219225
220226### 开关
221227
222- * ENABLE_TESTER:允许 Tester 启动,默认 true
223- * ENABLE_GETTER:允许 Getter 启动,默认 true
224- * ENABLE_SERVER:运行 Server 启动,默认 true
228+ - ENABLE_TESTER:允许 Tester 启动,默认 true
229+ - ENABLE_GETTER:允许 Getter 启动,默认 true
230+ - ENABLE_SERVER:运行 Server 启动,默认 true
225231
226232### 环境
227233
228- * APP_ENV:运行环境,可以设置 dev、test、prod,即开发、测试、生产环境,默认 dev
229- * APP_DEBUG:调试模式,可以设置 true 或 false,默认 true
234+ - APP_ENV:运行环境,可以设置 dev、test、prod,即开发、测试、生产环境,默认 dev
235+ - APP_DEBUG:调试模式,可以设置 true 或 false,默认 true
230236
231237### Redis 连接
232238
233- * REDIS_HOST:Redis 的 Host
234- * REDIS_PORT:Redis 的端口
235- * REDIS_PASSWORD:Redis 的密码
236- * REDIS_DB:Redis 的数据库索引,如 0、1
237- * REDIS_CONNECTION_STRING:Redis 连接字符串
238- * REDIS_KEY:Redis 储存代理使用字典的名称
239+ - REDIS_HOST:Redis 的 Host
240+ - REDIS_PORT:Redis 的端口
241+ - REDIS_PASSWORD:Redis 的密码
242+ - REDIS_DB:Redis 的数据库索引,如 0、1
243+ - REDIS_CONNECTION_STRING:Redis 连接字符串
244+ - REDIS_KEY:Redis 储存代理使用字典的名称
239245
240246### 处理器
241247
242- * CYCLE_TESTER:Tester 运行周期,即间隔多久运行一次测试,默认 20 秒
243- * CYCLE_GETTER:Getter 运行周期,即间隔多久运行一次代理获取,默认 100 秒
244- * TEST_URL:测试 URL,默认百度
245- * TEST_TIMEOUT:测试超时时间,默认 10 秒
246- * TEST_BATCH:批量测试数量,默认 20 个代理
247- * TEST_VALID_STATUS:测试有效的状态吗
248- * API_HOST:代理 Server 运行 Host,默认 0.0.0.0
249- * API_PORT:代理 Server 运行端口,默认 5555
250- * API_THREADED:代理 Server 是否使用多线程,默认 true
248+ - CYCLE_TESTER:Tester 运行周期,即间隔多久运行一次测试,默认 20 秒
249+ - CYCLE_GETTER:Getter 运行周期,即间隔多久运行一次代理获取,默认 100 秒
250+ - TEST_URL:测试 URL,默认百度
251+ - TEST_TIMEOUT:测试超时时间,默认 10 秒
252+ - TEST_BATCH:批量测试数量,默认 20 个代理
253+ - TEST_VALID_STATUS:测试有效的状态吗
254+ - API_HOST:代理 Server 运行 Host,默认 0.0.0.0
255+ - API_PORT:代理 Server 运行端口,默认 5555
256+ - API_THREADED:代理 Server 是否使用多线程,默认 true
251257
252258### 日志
253259
254- * LOG_DIR:日志相对路径
255- * LOG_RUNTIME_FILE:运行日志文件名称
256- * LOG_ERROR_FILE:错误日志文件名称
260+ - LOG_DIR:日志相对路径
261+ - LOG_RUNTIME_FILE:运行日志文件名称
262+ - LOG_ERROR_FILE:错误日志文件名称
257263
258264以上内容均可使用环境变量配置,即在运行前设置对应环境变量值即可,如更改测试地址和 Redis 键名:
259265
@@ -267,7 +273,7 @@ export REDIS_KEY=proxies:weibo
267273如果使用 Docker-Compose 启动代理池,则需要在 docker-compose.yml 文件里面指定环境变量,如:
268274
269275``` yaml
270- version : ' 3 '
276+ version : " 3 "
271277services :
272278 redis :
273279 image : redis:alpine
@@ -278,7 +284,7 @@ services:
278284 restart : always
279285 proxypool :
280286 build : .
281- image : ' germey/proxypool'
287+ image : " germey/proxypool"
282288 container_name : proxypool
283289 ports :
284290 - " 5555:5555"
@@ -310,7 +316,7 @@ class Daili66Crawler(BaseCrawler):
310316 daili66 crawler, http://www.66ip.cn/1.html
311317 " " "
312318 urls = [BASE_URL.format(page=page) for page in range(1, MAX_PAGE + 1)]
313-
319+
314320 def parse(self, html) :
315321 " " "
316322 parse html file to get proxies
@@ -326,8 +332,8 @@ class Daili66Crawler(BaseCrawler):
326332
327333在这里只需要定义一个 Crawler 继承 BaseCrawler 即可,然后定义好 urls 变量和 parse 方法即可。
328334
329- * urls 变量即为爬取的代理网站网址列表,可以用程序定义也可写成固定内容。
330- * parse 方法接收一个参数即 html,代理网址的 html,在 parse 方法里只需要写好 html 的解析,解析出 host 和 port,并构建 Proxy 对象 yield 返回即可。
335+ - urls 变量即为爬取的代理网站网址列表,可以用程序定义也可写成固定内容。
336+ - parse 方法接收一个参数即 html,代理网址的 html,在 parse 方法里只需要写好 html 的解析,解析出 host 和 port,并构建 Proxy 对象 yield 返回即可。
331337
332338网页的爬取不需要实现,BaseCrawler 已经有了默认实现,如需更改爬取方式,重写 crawl 方法即可。
333339
0 commit comments