Skip to content

Commit 7349020

Browse files
author
linzeen
committed
[modify] README.md
1 parent 5efcb6f commit 7349020

File tree

1 file changed

+175
-1
lines changed

1 file changed

+175
-1
lines changed

README.md

Lines changed: 175 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,182 @@
11
# Simple Proxy Pool
22
免费、简单、灵活的代理连接池
3+
## 安装与卸载
4+
安装包下载 或 `clone git@github.com:Remalloc/simple_proxy_pool.git`<br>
5+
```
6+
# 需要pip和setuptools
7+
# 进入程序目录安装
8+
python setup.py install
9+
# 卸载
10+
pip uninstall simple-proxy-pool
11+
```
312
## 快速开始
413
```python
14+
import time
515
from simple_proxy_pool.proxy_pool import ProxyPool
616

17+
pl = ProxyPool()
18+
pl.run()
19+
time.sleep(60) # 初次启动可能没有可以使用的代理,需要等待一段时间
20+
http = pl.get_one_http_url()
21+
if http:
22+
print(http)
23+
# 可以使用http代理
24+
https = pl.get_one_https_url()
25+
if https:
26+
print(https)
27+
# 可以使用https代理
728

8-
```
29+
# -----更好的嵌入代码------
30+
def get_http_proxy():
31+
while True:
32+
url = pl.get_one_http_url()
33+
if url:
34+
return url
35+
else:
36+
time.sleep(5)
37+
```
38+
### 注意
39+
* 每次获取的代理地址有可能相同也有可能不同,需要使用者自行判断
40+
* 因为免费代理存在时效性和不稳定性,所以尽量不要存储地址一直使用,代理池大约每40秒过滤一次地址,保证连接畅通.
41+
* 取出的连接不能保证一定能使用,注意做异常处理
42+
43+
## API
44+
```python
45+
46+
class ProxyPool(object):
47+
def __init__(self, total: int = 10, proxy_timeout: int = 3, crawl_interval: int = 40
48+
, log_config: dict = None):
49+
"""
50+
初始化连接池,使用run函数运行连接池
51+
:param total: 设置连接池的最大连接数.这个是估计值,开始运行时可能小于这个值,运行一段时间后也可能略大于这个值
52+
:param proxy_timeout: 代理超时时间,越小表示筛选出的连接速度越快,但是会导致可用连接变少.
53+
:param crawl_interval: 两次爬虫时间间隔,当连接池连接数小于设置值时,会启动爬虫.数值过小可能会导致IP被封.
54+
:param log_config: 自定义日志输出方式,参照logger.py
55+
"""
56+
pass
57+
58+
async def _filter_urls(self, urls: list, is_https: bool = False) -> list:
59+
"""
60+
过滤代理连接列表,清除不可用连接
61+
:param urls: 代理列表. 例如: ["http://1234:9090","https://1234:9090"]
62+
:param is_https: True或False,默认False.这将决定是否使用HTTPS协议测试连接
63+
:return: 过滤后的列表
64+
"""
65+
pass
66+
67+
async def acquire_url_list(self):
68+
"""用爬虫获取代理列表,并过滤列表."""
69+
pass
70+
71+
async def main(self):
72+
"""
73+
定时过滤当前代理地址,当可用连接数小于self.total时启用爬虫获取.
74+
"""
75+
pass
76+
77+
def set_spiders(self, spiders: list):
78+
"""
79+
设置爬虫列表,其中每个实例都应该继承spider.py中的Spider类
80+
:param spiders: 爬虫实例列表. 例如:[XiCiSpider(param)...]
81+
"""
82+
pass
83+
84+
def get_http_urls(self, nums: int = 0) -> list:
85+
"""
86+
获取一定数量的代理.
87+
:param nums: 代理数量.如果为0将会返回全部可用代理.
88+
注意: 如果代理数量超过当前代理列表大小,可能会返回重复的代理.
89+
:return: 可用于HTTP协议的代理列表.
90+
"""
91+
pass
92+
93+
def get_one_http_url(self) -> str:
94+
"""
95+
随机返回一个代理.
96+
:return: 一个可用于HTTP协议的代理.
97+
"""
98+
pass
99+
100+
def get_https_urls(self, nums: int = 0) -> list:
101+
"""
102+
获取一定数量的代理.
103+
:param nums: 代理数量.如果为0将会返回全部可用代理.
104+
注意: 如果代理数量超过当前代理列表大小,可能会返回重复的代理.
105+
:return: 可用于HTTPS协议的代理列表.
106+
"""
107+
pass
108+
109+
def get_one_https_url(self) -> str:
110+
"""
111+
随机返回一个代理.
112+
:return: 一个可用于HTTP协议的代理.
113+
"""
114+
pass
115+
116+
def run(self):
117+
"""开启代理连接池,会为当前进程启动一个守护进程,主进程结束时自动结束"""
118+
pass
119+
120+
def close(self):
121+
"""关闭代理连接池并清空代理列表,如果连接池已开启"""
122+
pass
123+
```
124+
## 扩展
125+
本程序可以很方便的定制自己所需要的功能,下面具体介绍几种场景.
126+
#### 独立使用连接池
127+
可以直接将连接池作为单独模块使用,只需要主进程定时从池中取出连接存入数据库,或者变为使用API提取
128+
#### 扩展爬虫IP列表
129+
spider模块提供了一个抽象类和一个方法类,只需要实现抽象类中的方法即可被代理池使用<br>
130+
```python
131+
class AsyncBaseOperation(object):
132+
"""封装了aiohttp的基础操作,简化请求操作,可选继承"""
133+
134+
@staticmethod
135+
async def fetch(session, url: str, proxies: list = None):
136+
"""
137+
使用已存在的会话访问网页
138+
:param session: 会话对象aiohttp.ClientSession.
139+
:param url: 网页地址.
140+
:param proxies: 代理列表,默认不使用代理,如果提供会从中随机选择一个代理使用.
141+
:return: 网页内容.
142+
"""
143+
pass
144+
145+
@staticmethod
146+
async def get(url, proxies: list = None):
147+
"""
148+
创建一个会话并访问网页
149+
:param url: 网页地址.
150+
:param proxies: 代理列表,默认不使用代理,如果提供会从中随机选择一个代理使用.
151+
:return: 网页内容.
152+
"""
153+
pass
154+
155+
class Spider:
156+
"""所有爬虫类必须继承此类"""
157+
158+
def get_http_urls(self) -> list:
159+
"""返回http代理列表,例如: ["http://1.2.3.4:56"]"""
160+
pass
161+
162+
def get_https_urls(self) -> list:
163+
"""返回http代理列表,例如: ["http://1.2.3.4:56"]"""
164+
pass
165+
```
166+
**注意!!:使用新的爬虫类时需要在连接池启动前用set_spiders函数设置爬虫列表**
167+
## 测试
168+
直接运行proxy_pool.py可以进行简单的测试,会不时的将可用的地址打印出来.
169+
<br>
170+
如果你想运行单元测试可以直接运行unit_test目录下的test.py,如果你扩展了spider强烈建议你将其加入到单元测试中,
171+
并且你只需要在TestSpider中添加两行代码即可:
172+
```python
173+
from simple_proxy_pool.spider import NewSpider
174+
class TestSpider(TestBase):
175+
#...
176+
def test_new_spider(self):
177+
self._test_spider(NewSpider)
178+
```
179+
## 关于
180+
* 本项目使用BSD开源协议
181+
* 目前还需要完善筛选逻辑和部分文档,欢迎提交PR共同开发
182+
* 如有问题或建议可提交issue或联系remalloc.virtual@gmail.com

0 commit comments

Comments
 (0)