|
1 | 1 | # Simple Proxy Pool |
2 | 2 | 免费、简单、灵活的代理连接池 |
| 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 | +``` |
3 | 12 | ## 快速开始 |
4 | 13 | ```python |
| 14 | +import time |
5 | 15 | from simple_proxy_pool.proxy_pool import ProxyPool |
6 | 16 |
|
| 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代理 |
7 | 28 |
|
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