我们在爬取一些网页的时候经常会被封IP,这时候我们就需要IP代理池
一般情况下我们有两种选择一种是自建,一种是花钱
例如芝麻http代理价目表如下

可以发现价格还是比较高的,对于我这种穷鬼来说还是劝退了
然后是自建代理池,这种办法的优点是免费,但是其他就只剩缺点了
自建代理池因为是去爬取公开的免费代理所以IP的成功率就不高,暂且不说搭建一个IP代理池要花费的时间
对于小白来说就算看着教程也不一定可以搞明白,所以我们可以去GitHub上面转一转,发现代理池还是许多的

我们就来用一个GitHub上挺火的一个proxy_pool
出师不利
但是出师不利我们在安装环境是就遇到了问题

我们在安装meinheld这个库时报错了
这是因为Meinheld是一个符合WSGI标准的Web服务器。(支持 PEP333 和 PEP3333)
而且只支持Linux、FreeBSD 和 macOS

但是考虑到很多人用的是Windows我开始寻找方法解决这个问题,然后在项目地址的版本页面有以前的版本而且不需要这个库,如果各位需要我以后可以出一期Linux的安装教程,这个项目可以选择在docker运行但也是报错所以我们就直接运行了
正文
下载源码
首先第一步下载项目文件或者下载我准备好的文件,因为需要大量的修改有点麻烦,如果不嫌麻烦可以跟着教程一步一步来
如果你安装了git那么直接
git clone https://github.com/jhao104/proxy_pool.git
在这之前要先cd到你拉取项目的文件夹
如果没有git那么就来到项目地址然后下载zip格式源码

然后把压缩包解压的想要存放的位置
安装redis
由于我已经安装过了所以就不过的描述了
选择msi或者zip

打开msi后选项不用更改默认就行,如果在界面看到,…. to PATH这个选项可以勾上,这是添加环境变量的,如果不勾选就要去redis的安装路径才可以

安装好后我们打开终端去redis的安装路径(添加了PATH)则不用,然后输入
redis-server --service-start
在关闭窗口输入
redis-cli.exe -h 127.0.0.1 -p 6379
如果出现这种情况就说明成功了

修改文件(下载我的文件则可跳过)
首先来到保存源码的文件夹
找到requirements.txt

把里面的内容改成
APScheduler==3.2.0
werkzeug==0.15.5
Flask==1.0
requests==2.20.0
click==7.0
gunicorn==19.9.0
lxml
redis
然后在文件位置打开终端输入
pip install -r requirements.txt
然后打开setting.py
找到第40行

修改成
DB_CONN = 'redis://:@127.0.0.1:6379'
也就是把pwd给去了
这时候应该就可以运行了,但是webapi会报错
所以来到/api/proxyApi.py
在第101行

app.run(host='127.0.0.1',port=2463)
这样就大功告成了
如果你有运行sh文件的环境,那么直接打开start.sh再访问127.0.0.1:2463
就可以看到

第一个输入
python proxyPool.py schedule
第二个输入
python proxyPool.py server
然后在两个窗口应该可以看到


然后再访问127.0.0.1:2463
就可以了
然后开启webapi后会在127.0.0.1:2463开启一下接口服务
api | method | Description | params |
/ | GET | api介绍 | None |
/get | GET | 随机获取一个代理 | 可选参数: ?type=https 过滤支持https的代理 |
/pop | GET | 获取并删除一个代理 | 可选参数: ?type=https 过滤支持https的代理 |
/all | GET | 获取所有代理 | 可选参数: ?type=https 过滤支持https的代理 |
/count | GET | 查看代理数量 | None |
/delete | GET | 删除代理 | ?proxy=host:ip |
爬虫使用
如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如:
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").json()
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
# 你的爬虫代码
def getHtml():
# ....
retry_count = 5
proxy = get_proxy().get("proxy")
while retry_count > 0:
try:
html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
# 使用代理访问
return html
except Exception:
retry_count -= 1
# 删除代理池中代理
delete_proxy(proxy)
return None
扩展代理
项目默认包含几个免费的代理获取源,但是免费的毕竟质量有限,所以如果直接运行可能拿到的代理质量不理想。所以,提供了代理获取的扩展方法
添加一个新的代理源方法如下:
class ProxyFetcher(object):
# ....
# 自定义代理源获取方法
@staticmethod
def freeProxyCustom1(): # 命名不和已有重复即可
# 通过某网站或者某接口或某数据库获取代理
# 假设你已经拿到了一个代理列表
proxies = ["x.x.x.x:3128", "x.x.x.x:80"]
for proxy in proxies:
yield proxy
# 确保每个proxy都是 host:ip正确的格式返回
添加好方法后,修改setting.py文件中的PROXY_FETCHER项:
在PROXY_FETCHER
下添加自定义方法的名字:
PROXY_FETCHER = [
"freeProxy01",
"freeProxy02",
# ....
"freeProxyCustom1" # # 确保名字和你添加方法名字一致
]
schedule
进程会每隔一段时间抓取一次代理,下次抓取时会自动识别调用你定义的方法。
请登录后发表评论
注册
社交帐号登录