IP代理池

我们在爬取一些网页的时候经常会被封IP,这时候我们就需要IP代理池

一般情况下我们有两种选择一种是自建,一种是花钱

例如芝麻http代理价目表如下

IP代理池插图
可以发现价格还是比较高的,对于我这种穷鬼来说还是劝退了

然后是自建代理池,这种办法的优点是免费,但是其他就只剩缺点了

自建代理池因为是去爬取公开的免费代理所以IP的成功率就不高,暂且不说搭建一个IP代理池要花费的时间

对于小白来说就算看着教程也不一定可以搞明白,所以我们可以去GitHub上面转一转,发现代理池还是许多的

IP代理池插图1

我们就来用一个GitHub上挺火的一个proxy_pool

出师不利

但是出师不利我们在安装环境是就遇到了问题

IP代理池插图2

我们在安装meinheld这个库时报错了

这是因为Meinheld是一个符合WSGI标准的Web服务器。(支持 PEP333 和 PEP3333)

而且只支持Linux、FreeBSD 和 macOS

IP代理池插图3
但是考虑到很多人用的是Windows我开始寻找方法解决这个问题,然后在项目地址的版本页面有以前的版本而且不需要这个库,如果各位需要我以后可以出一期Linux的安装教程,这个项目可以选择在docker运行但也是报错所以我们就直接运行了

正文

下载源码

首先第一步下载项目文件或者下载我准备好的文件,因为需要大量的修改有点麻烦,如果不嫌麻烦可以跟着教程一步一步来

如果你安装了git那么直接

git clone https://github.com/jhao104/proxy_pool.git

在这之前要先cd到你拉取项目的文件夹

如果没有git那么就来到项目地址然后下载zip格式源码

IP代理池插图4

然后把压缩包解压的想要存放的位置

安装redis

由于我已经安装过了所以就不过的描述了

选择msi或者zip

IP代理池插图5

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

IP代理池插图6

安装好后我们打开终端去redis的安装路径(添加了PATH)则不用,然后输入

redis-server --service-start

在关闭窗口输入

redis-cli.exe -h 127.0.0.1 -p 6379 

如果出现这种情况就说明成功了

IP代理池插图7

修改文件(下载我的文件则可跳过)

首先来到保存源码的文件夹

找到requirements.txt

IP代理池插图8

把里面的内容改成

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行

IP代理池插图9

修改成

DB_CONN = 'redis://:@127.0.0.1:6379'

也就是把pwd给去了

这时候应该就可以运行了,但是webapi会报错

所以来到/api/proxyApi.py

在第101行

IP代理池插图10
修改成
app.run(host='127.0.0.1',port=2463)

这样就大功告成了

如果你有运行sh文件的环境,那么直接打开start.sh再访问127.0.0.1:2463

就可以看到

IP代理池插图11
如果不可以运行sh文件那么可以在源代码的位置打开两个终端窗口

第一个输入

python proxyPool.py schedule

第二个输入

python proxyPool.py server

然后在两个窗口应该可以看到

IP代理池插图12
第一个窗口
IP代理池插图13
第二个窗口

然后再访问127.0.0.1:2463

就可以了

然后开启webapi后会在127.0.0.1:2463开启一下接口服务

apimethodDescriptionparams
/GETapi介绍None
/getGET随机获取一个代理可选参数: ?type=https 过滤支持https的代理
/popGET获取并删除一个代理可选参数: ?type=https 过滤支持https的代理
/allGET获取所有代理可选参数: ?type=https 过滤支持https的代理
/countGET查看代理数量None
/deleteGET删除代理?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 进程会每隔一段时间抓取一次代理,下次抓取时会自动识别调用你定义的方法。

源码下载

https://wwb.lanzoul.com/i1m9y05u6s3i

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 抢沙发

请登录后发表评论