Q’Python

IPProxy_Pool + PySpider + Squid 搭建自动更新代理

最近在玩 Python 爬虫,就遇到了这样的需求,需要能够自动轮询的代理服务器,又不想掏钱买代理池,所以就想有没有这么个东西。然后 GitHub 搜了下,果然有。

记录下来,以防未来再次搭建的时候忘了或遗漏了什么。

1、各模块的 GitHub 地址:

IPProxyPool: https://github.com/qiyeboy/IPProxyPool

PySpider: https://github.com/binux/pyspider

2、Squid 安装及配置:

以下环境为 ubuntu

创建一个 squid 配置模板

这是一段提示

每次拿到代理之后把代理设置成当前 squid 的 parent
由于有可能有相同 ip,而端口不同的代理
会报错

所以要在最后加上 proxy 的 name

然后保存 conf,并重启 squid

2、在 PySpider 中创建一个任务用于从 IPProxyPool 获取最新的代理 IP 并写入 Squid 配置中

以下只贴出代码

其中: http://127.0.0.1:8000?types=0&country=国内 为获取国内的高匿代理,具体配置可以看 IPProxyPool 的文档。

index_page 中的代码主要完成 Squid 的配置文件,并重新载入使其生效,这里需要注意 message = os.system('sudo service squid reload') 中,如果你不是通过 root 启动的 pyspider,需要执行命令的话要加 sudo,而一般情况下还要输密码,会造成 pyspider 出错而无法执行。所以需要将你的用户设置为 sudo 免密码。方法如下:

网络上很多文章都是让你直接修改 /etc/sudoers 文件,这是很危险的,而且我实际修改的时候还出现了各种问题,而且并没有成功。正确方法应该是在 /etc/sudoers.d 里新建一个配置文件,然后按如下写法写入

其中 username 是你的用户名

然后退出或注销或重启或等 5 分钟重试下看成功不成功。

以上代码中我用了 reload 而不是 restart,因为在实际操作中发现由于配置文件很大,造成 Squid 在 restart 时很慢,会导致 PySpider 超时。解决方法可以用 reload,或者把 Squid 的配置文件中的注释全去掉(注意是把模版文件的去掉,因为通过脚本生成的配置文件在每次执行时都会被覆盖)

这里还会有一个问题,如果发现第一次执行脚本后代理不成功,可以手动执行 service squid restart ,之后使用 reload 就不会有问题了。

3、使用

在 PySpider 中使用很简单,只要在 crawl_config 中设置

就可以了,其中 3128 是 Squid 的默认端口

如果内网的其他机器需要使用这个代理,修改 http_access deny all 为 http_access allow all ,如果是公网的机器,请谨慎设置,最好是限定客户端 IP 或设置用户名密码,同时把默认端口改了。

本篇没说怎么装 PySpider 和 IPProxyPool,是因为他们的文档都说到很清楚了。具体查看他们的文档就好。

5 thoughts on “IPProxy_Pool + PySpider + Squid 搭建自动更新代理

    1. 如果是 pyspider 开启了 phantomjs ,可以用以下方式设置:
      pyspider phantomjs -- --proxy=ip:port

      pyspider --phantomjs-proxy 127.0.0.25555 all

      参考 https://github.com/binux/pyspider/issues/448#issuecomment-220888733

      1. windows 下搭建的添加 cache_peer 119....* parent 8888 0 no-query weighted-round-robin weight=1 connect-fail-limit=2 allow-miss max-conn=5 name=proxy_01
        服务启动不了就会报错,3.0 和 2,7 版本的都测试一样,不知道什么原因,请问师傅有遇到过吗?

  1. 在 squid.conf 中添加如下 cache_peer 119...* parent 8888 0 no-query weighted-round-robin weight=1 connect-fail-limit=2 allow-miss max-conn=5 name=proxy_19
    就会报错,服务启动不了,去掉才可以起来,3.0 和 2.7 都测试过了,在 windows 上安装了,不知道老师傅遇到过吗?怎么解决的。

  2. connect-fail-limit=2 这个参数去掉 weighted-round-robin 这个参数改成 round-robin ,那是不是就没办法启动了,也没办法轮询了?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.