文章目录

  • 1. 前言
  • 2. 教程
  • 3. 官网
  • 4. 在线demo
    • 4.1. 本地部署
    • 4.2. 安装
      • 4.2.1. Python源码构建安装
        • 4.2.1.1. 安装redis数据库
          • 4.2.1.1.1. 下载redis源码
          • 4.2.1.1.2. 启动redis服务
          • 4.2.1.1.3. 安装redis服务
          • 4.2.1.1.4. 再次通过命令启动redis服务
          • 4.2.1.1.5. 测试redis服务是否可用
        • 4.2.1.2. 下载proxy_pool源码
        • 4.2.1.3. 安装依赖
        • 4.2.1.4. 更新配置
          • 4.2.1.4.1. 配置参数
          • 4.2.1.4.2. 配置参数案例
        • 4.2.1.5. 启动项目
        • 4.2.1.6. 测试API的调用
          • 4.2.1.6.1. 直接打开网页版
          • 4.2.1.6.2. 代码测试
      • 4.2.2. docker安装
      • 4.2.3. API调用
  • 5. 报错

1. 前言

  • 之前做爬虫的时候,经常会遇到对于一个网页,使用同一个IP多次会被禁掉IP的问题,我们可以自己手动更换代理IP再继续这个问题但多少会有点麻烦,我对于一个懒人来说,手动更换IP太麻烦,而且也不符合程序员懒惰的美德,于是便有了下面的故事。
  • proxy_pool 是一个开源的代理池,聚合了各大免费ip 代理池。当自己的爬虫因为爬的太快了 ip 被封了的时候,代理池就可以派上用场啦
  • 爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库,定时验证入库的代理保证代理的可用性,提供API和CLI两种使用方式。同时你也可以扩展代理源以增加代理池IP的质量和数量。

2. 教程

  • 部署自己的代理池 - idealclover

3. 官网

  • GitHub - jhao104/proxy_pool: Python爬虫代理IP池(proxy pool)

4. 在线demo

  • demo.spiderpy.cn/

4.1. 本地部署

4.2. 安装

  • python爬虫添加代理ip池ProxyPool (Windows) - 灰信网(软件开发博客聚合)

4.2.1. Python源码构建安装

4.2.1.1. 安装redis数据库

4.2.1.1.1. 下载redis源码
  • Windows下安装Redis图文教程_喵代王-香菜的博客-CSDN博客_windows安装redis
  • windows首先下载安装Redis安装包,并解压到合适位置(放哪都行)
4.2.1.1.2. 启动redis服务
  • cmd进入文件位置
  • redis-server.exe redis.windows.conf
4.2.1.1.3. 安装redis服务
  • 再打开一个cmd窗口,输入下面的命令,将Redis安装到Windows服务中
  • redis-server --service-install redis.windows.conf
  • 查看是否添加进去了服务
  • services.msc
4.2.1.1.4. 再次通过命令启动redis服务
  • 关闭第一个“启动服务”cmd窗口,另开一个cmd窗口,启动服务
  • redis-server --service-start
  • 关闭服务命令
  • redis-server --service-stop
4.2.1.1.5. 测试redis服务是否可用
  • redis-cli.exe -h 127.0.0.1 -p 6379
  • 如果没报错,并且显示下面的界面的话,就表示这个redis服务现在可用

4.2.1.2. 下载proxy_pool源码

git clone git@github.com:jhao104/proxy_pool.git
  • 如果无法通过这种方法克隆的话,就手动下载吧
  • 或者直接下载特定的release版本
  • Releases · jhao104/proxy_pool · GitHub

4.2.1.3. 安装依赖

pip install -r requirements.txt

4.2.1.4. 更新配置

  • 配置文件 setting.py 位于项目的主目录下:
4.2.1.4.1. 配置参数
  • 配置参考 — ProxyPool 2.1.0 文档
  • 配置参数说明
  • 服务配置
  • HOST
  • API服务监听的IP, 本机访问设置为 127.0.0.1, 开启远程访问设置为: 0.0.0.0
  • PORT
  • API服务监听的端口.
  • 数据库配置
  • DB_CONN
  • 用户存放代理IP的数据库URI, 配置格式为: db_type://[[user]:[pwd]]@ip:port/[db]
  • 目前支持的db_type有: ssdb 、 redis.
  • DB_CONN配置示例
# SSDB IP: 127.0.0.1  Port: 8888
DB_CONN = 'ssdb://@127.0.0.1:8888'
# SSDB IP: 127.0.0.1  Port: 8899  Password:  123456
DB_CONN = 'ssdb://:123456@127.0.0.1:8888' # Redis IP: 127.0.0.1  Port: 6379
DB_CONN = 'redis://@127.0.0.1:6379'
# Redis IP: 127.0.0.1  Port: 6379  Password:  123456
DB_CONN = 'redis://:123456@127.0.0.1:6379'
# Redis IP: 127.0.0.1  Port: 6379  Password:  123456  DB: 15
DB_CONN = 'redis://:123456@127.0.0.1:6379/15'
         - 我这里没有密码,所以直接就设置成了- DB_CONN = 'redis://@127.0.0.1:6379/0'- ![](https://img-blog.csdnimg.cn/img_convert/1f5a0a730e71f0290c6a6f68f1f9b37e.png) -
  • TABLE_NAME
  • 存放代理的数据载体名称, ssdb和redis的存放结构为hash.
  • 采集配置
  • PROXY_FETCHER
  • 启用的代理采集方法名, 代理采集方法位于 fetcher/proxyFetcher.py 类中.
  • 由于各个代理源的稳定性不容易掌握, 当某个代理采集方法失效时, 可以该配置中注释掉其名称.
  • 如果有增加某些代理采集方法, 也请在该配置中添加其方法名, 具体请参考 /dev/extend_fetcher.
  • 调度程序每次执行采集任务时都会再次加载该配置, 保证每次运行的采集方法都是有效的.
  • 这里需要实时进行更新
  • 校验配置
  • HTTP_URL
  • 用于检验代理是否可用的地址, 默认为 http://httpbin.org ,可根据使用场景修改为其他地址.
  • HTTPS_URL
  • 用于检验代理是否支持HTTPS的地址, 默认为 https://www.qq.com ,可根据使用场景修改为其他地址.
  • VERIFY_TIMEOUT
  • 检验代理的超时时间, 默认为 10 , 单位秒. 使用代理访问 HTTP(S)_URL 耗时超过 VERIFY_TIMEOUT 时, 视为代理不可用.
  • MAX_FAIL_COUNT
  • 检验代理允许最大失败次数, 默认为 0, 即出错一次即删除.
  • POOL_SIZE_MIN
  • 代理检测定时任务运行前若代理数量小于 POOL_SIZE_MIN, 则先运行抓取程序.
4.2.1.4.2. 配置参数案例
# Config.ini 为项目配置文件
# 配置DB
type = SSDB       # 如果使用SSDB或redis数据库,均配置为SSDB
host = localhost  # db host
port = 6379       # 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
  • 第一个port是你数据库端口号, 第二个是api端口号
  • 目标计算机积极拒绝 · Issue #118 · jhao104/proxy_pool · GitHub

4.2.1.5. 启动项目

  • 如果已配置好运行环境, 具备运行条件, 可以通过 proxyPool.py 启动. proxyPool.py 是项目的CLI入口. 完整程序包含两部份: schedule 调度程序server API服务, 调度程序负责采集验证代理, API服务提供代理服务HTTP接口.
  • 通过命令行程序分别启动 调度程序API服务:
  • 启动调度程序:python proxyPool.py schedule
  • 可以看到,正在采集对于IP,有的成功,有的失败
  • 最终稳定下来
  • 再开一个命令号,启动webApi服务:python proxyPool.py server
python proxyPool.py schedule
python proxyPool.py server

4.2.1.6. 测试API的调用

4.2.1.6.1. 直接打开网页版
  • 127.0.0.1:5010/get/
  • http://127.0.0.1:5010/get/
  • 这里需要注意的是,网址端口应该改成自己之前定义的端口
  • 每一次刷新上面的代理IP地址都会发生改变
4.2.1.6.2. 代码测试
import requests def get_proxy(): #5000:settings中设置的监听端口,不是Redis服务的端口 return requests.get("http://127.0.0.1:5000/get/").json() def delete_proxy(proxy): requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy)) # 主代码
def getHtml(): retry_count = 5 proxy = get_proxy().get("proxy") print(proxy) while retry_count > 0: try: html = requests.get('http://www.baidu.com', proxies={"http": "http://{}".format(proxy)}) print(html.text) break except Exception: retry_count -= 1 # 删除代理池中代理 delete_proxy(proxy) return None getHtml()

4.2.2. docker安装

安装

docker pull jhao104/proxy_pool docker run --env DB_CONN=redis://:password@ip:port/0 -p 5010:5010 jhao104/proxy_pool:latest
  • 运行
docker-compose up -d

4.2.3. API调用

启动web服务后, 默认配置下会开启127.0.0.1:5010/ 的api接口服务:
参数

5. 报错

  • ValueError: invalid literal for int() with base 10: ‘port’

  • 可能是一个端口不可用吧,在GUI界面中修改一下端口号就好了

  • redis.exceptions.ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目标计算机积极拒绝,无法连接。.2022-12-24 20:52:10,677 launcher.py[line:39] INFO exit!

  • 可能只是自己参数设置的不对吧

  • redis.exceptions.AuthenticationError: Client sent AUTH, but no password is set 2022-12-24 21:56:48,828 launcher.py[line:39] INFO exit!

  • redis的账号密码设置的不对
    DB_CONN配置示例

  • ImportError: cannot import name ‘Markup’ from ‘jinja2’ (D:\Program\Anaconda3\lib\site-packages\jinja2_init_.py)

  • python版本太高了,目前支持到3.6. 3.6以上的版本把requirements.txt里面的版本号删掉 重新pip install 一下

### APScheduler
werkzeug
Flask
requests
click
gunicorn
lxml
redis
  • pip uninstall -r requirements.txt

  • pip install -r requirements.txt

  • 运行出错! · Issue #663 · jhao104/proxy_pool · GitHub

之后就正常了

  • requests.exceptions.ConnectionError: HTTPConnectionPool(host=‘127.0.0.1’, port=5000): Max retries exceeded with url: /get/ (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x000001AF5F88EAD0 Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’))

  • 很简单,端口不匹配,更改即可

ctionPool**(host=‘127.0.0.1’, port=5000): Max retries exceeded with url: /get/ (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x000001AF5F88EAD0 Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’))

  • 很简单,端口不匹配,更改即可
    [外链图片转存中…(img-nAUDtJec-1671896468370)]

使用proxy_pool来为爬虫程序自动更换代理IP相关推荐

  1. 爬虫实战篇--更换代理ip

    背景 我们在爬取网站数据,防止被对方服务器发现的一个最重要的操作是更换代理ip,因为你的电脑主机在局域网下的ip是固定的,所以你经常使用一个代理ip对网站进行大规模爬取,就容易被对方服务器检测出来是非 ...

  2. Puppeteer 不重启如何更换代理 IP

    我们知道,在写爬虫的过程中,如果总是使用同一个 IP,很容易就会被网站识别并封禁,所以需要使用代理 IP 并经常更换. 但如果你在网上搜索 Puppeteer 如何更换代理 IP,你会发现,网上的解决 ...

  3. 每次更换代理IP仍然被反爬

    每次更换代理IP仍然被反爬 客户问题 使用产品类型: 隧道代理动态版(每次请求更换IP). 问题描述: 目标网站有反爬机制,两次搜索的间隔时间不得少于25秒.使用了我们的隧道代理后,还是会被检测出来, ...

  4. 爬虫一定要用代理IP吗,不用行不行

    目录 1.爬虫一定要用代理IP吗 2.爬虫为什么要用代理IP 3.爬虫怎么使用代理IP 4.爬虫使用代理IP的注意事项 1.爬虫一定要用代理IP吗 很多人觉得,爬虫一定要使用代理IP,否则将寸步难行. ...

  5. 爬虫采集自己构建代理ip池有什么优势?

    为何一些爬虫采集的专业技术人员购买了代理ip还会继续自己构建一个ip池,自己构建ip池有什么优势? (1)可无限制的调用API获取代理ip; 购买收费的代理ip,绝大多数都会提供API链接接口,客户利 ...

  6. 代理ip网站开发_网站反爬虫策略,用代理IP都能解决吗?

    很多人会使用到网页采集器,其实这也是通过程序来进行采集的,如果没有使用代理IP,采集速度快了,照样是会被封住的.另外,这些网站还有其他的一些反爬策略,同样也会影响到我们采集网页的数据,这是如何限制的呢 ...

  7. Python之网络爬虫(验证码、代理IP、防反爬策略、封装一个抓取页面的函数)

    文章目录 一.使用tesseract做OCR验证码识别 二.代理服务器设置 三.反爬与防反爬 四.封装一个抓取页面的函数 一.使用tesseract做OCR验证码识别 1.cookie, sessio ...

  8. Windows上利用Python自动切换代理IP的终极方案!

    转载:http://www.jianshu.com/p/49c444d9a435 文/solomonxie(简书作者) 原文链接:http://www.jianshu.com/p/49c444d9a4 ...

  9. python 隐藏爬虫身份(或代理IP)

    参考链接: Python实战:如何隐藏自己的爬虫身份 https://blog.csdn.net/qzc70919700/article/details/73305026 使用爬虫访问网站,需要尽可能 ...

最新文章

  1. python中国大学排名爬虫写明详细步骤-python中国大学排名爬虫
  2. 举例讲解Linux系统下Python调用系统Shell的方法
  3. java多线程--多线程基础小结
  4. mybatis generator 属性详解
  5. sjms-4 行为型模式
  6. JAVA四种基本排序总结
  7. Springboot-Jpa多数据库配置-2.0+版本
  8. wampserver的phpmyadmin(默认3306)端口如何更改为3307?
  9. 再回首Java第二天
  10. 面向对象:三大特性与五大原则
  11. 8.声卡驱动03-自己实现alsa驱动-虚拟声卡-缓存
  12. 浅谈某定设计网站非会员去除水印
  13. 《金融学》期末小题库
  14. python画散点图<plt.scatter() 和sns.scatterplot()>
  15. 无法连接到服务器。错误代码 0x80072EFD
  16. Fluent的融化凝固模型介绍
  17. 如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类
  18. 给Flutter中的Widget设置透明度
  19. ROS TF2静态坐标发布
  20. 【工具】复制别人的CSDN博客文章到本地

热门文章

  1. 复现Nature图表 ggplot做面积图(折线面积图)
  2. 数字化转型如何执行?
  3. 安全风险识别是什么?主要内容有哪些?
  4. cropped-cherries.jpg
  5. MYSQL连接数设置
  6. mysql导出txt,用Excel打开乱码
  7. 小程序这一波操作让拼多多又火了!
  8. linux打开文件夹所有文件名,获取文件夹下的所有文件名 (linux windows)
  9. 信安学习-day33
  10. 全新DR5超级汉化加强版来了, 一键即可完成大师级磨皮