搭建爬虫代理池
发布于 1 个月前 作者 min12 2206 次浏览 来自 分享

代理IP从何而来?

刚自学爬虫的时候没有代理IP就去西刺有免费代理的网站去爬,还是有个别代理能用。当然,如果你有更好的代理接口也可以自己接入例如(亿牛云代理)

免费代理的采集也很简单,无非就是:访问页面页面 —> 正则/xpath提取 —> 保存

如何保证代理质量?

可以肯定免费的代理IP大部分都是不能用的,不然别人为什么还提供付费的(不过事实是很多代理商的付费IP也不稳定,也有很多是不能用)。所以采集回来的代理IP不能直接使用,可以写检测程序不断的去用这些代理访问一个稳定的网站,看是否可以正常使用。这个过程可以使用多线程或异步的方式,因为检测代理是个很慢的过程。

采集回来的代理如何存储?

这里不得不推荐一个高性能支持多种数据结构的NoSQL数据库SSDB,用于代理Redis。支持队列、hash、set、k-v对,支持T级别数据。是做分布式爬虫很好中间存储工具。

如何让爬虫更简单的使用这些代理?

答案肯定是做成服务咯,python有这么多的web框架,随便拿一个来写个api供爬虫调用。这样有很多好处,比如:当爬虫发现代理不能使用可以主动通过api去delete代理IP,当爬虫发现代理池IP不够用时可以主动去refresh代理池。这样比检测程序更加靠谱。


代理池由四部分组成:

ProxyGetter:

代理获取接口,目前有5个免费代理源,每调用一次就会抓取这个5个网站的最新代理放入DB,可自行添加额外的代理获取接口;

DB:

用于存放代理IP,现在暂时只支持SSDB。至于为什么选择SSDB,大家可以参考这篇文章,个人觉得SSDB是个不错的Redis替代方案,如果你没有用过SSDB,安装起来也很简单,可以参考这里;

Schedule:

计划任务用户定时去检测DB中的代理可用性,删除不可用的代理。同时也会主动通过ProxyGetter去获取最新代理放入DB;

ProxyApi:

代理池的外部接口,由于现在这么代理池功能比较简单,花两个小时看了下Flask,愉快的决定用Flask搞定。功能是给爬虫提供get/delete/refresh等接口,方便爬虫直接使用。

我是在github上面看到的,这里也会把过程记录下来:

1.下载源码:

git clone git@github.com:jhao104/proxy_pool.git
或者直接到https://github.com/jhao104/proxy_pool 下载zip文件
复制代码

2.安装:

pip install -r requirements.txt
复制代码

3.配置Config.init:

# Config.ini 为项目配置文件
# 配置DB
type = SSDB       # 如果使用SSDB或redis数据库,均配置为SSDB
host = localhost  # db host
port = 8888       # db port
name = proxy      # 默认配置
# 配置 ProxyGetter
freeProxyFirst  = 1  # 这里是启动的抓取函数,可在ProxyGetter/getFreeProxy.py 扩展
freeProxySecond = 1
....
# 配置 HOST (api服务)
ip = 127.0.0.1       # 监听ip,0.0.0.0开启外网访问
port = 5010          # 监听端口
# 上面配置启动后,代理api地址为 http://127.0.0.1:5010
复制代码

启动

如果前面程序都完成了,接下来你可以启动程序了,进入Run目录,

运行:

python main.py

查看

启动过几分钟后就能看到抓取到的代理IP,你可以直接到数据库中查看,推荐一个SSDB可视化工具。

也可以通过api访问http://127.0.0.1:5010 查看。

API

/get GET 随机获取一个代理 None

/get_all GET 获取所有代理 None

/get_status GET 查看代理数量 None

/delete GET 删除代理 proxy=host:ip

我通过浏览器输入:http://www.16yun.cn/get_all/

得到如下效果:

[
    "202.100.83.139:80",
    "117.127.0.197:80",
    "218.60.8.98:3129",
    "117.127.0.197:8080",
    "218.60.8.99:3129",
    "219.141.153.43:80",
    "114.215.95.188:3128",
    "219.141.153.35:80",

使用爬虫代理


        #! -*- encoding:utf-8 -*-

        import requests
        import random

        # 要访问的目标页面
        targetUrl = "http://httpbin.org/ip"

        # 要访问的目标HTTPS页面
        # targetUrl = "https://httpbin.org/ip"

        # 代理服务器(产品官网 www.16yun.cn)
        proxyHost = "t.16yun.cn"
        proxyPort = "31111"

        # 代理隧道验证信息
        proxyUser = "username"
        proxyPass = "password"

        proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
            "host" : proxyHost,
            "port" : proxyPort,
            "user" : proxyUser,
            "pass" : proxyPass,
        }

        # 设置 http和https访问都是用HTTP代理
        proxies = {
            "http"  : proxyMeta,
            "https" : proxyMeta,
        }

        #  设置IP切换头
        tunnel = random.randint(1,10000)
        headers = {"Proxy-Tunnel": str(tunnel)}

        resp = requests.get(targetUrl, proxies=proxies, headers=headers)

        print resp.status_code
        print resp.text
回到顶部