代理IP池建立

前言

之前提到过urllib和requests的利用代理ip的访问方式 。

  • https://blog.csdn.net/zhouchen1998/article/details/81318300
  • https://blog.csdn.net/zhouchen1998/article/details/81479092

缘由

但是为什么我们要使用代理ip?

  • 因为利用爬虫这样的网络机器人去毫无代价的爬取网站信息不仅不道德还会给对方的服务器带来巨大负担,尽管存在着“爬虫道德”不过这也是有素质的人的自我遵守,没有什么约束力。对此网站的反爬虫策略一直没有停止过,其中一个手段就是判断你的网页操作是不是人,如果是多次频繁爬取的机器人那么属于你机器的唯一身份ip地址就会被对方封禁,你将不能访问该网站。

而针对这种措施,其中比较行之有效的方法就是我不使用自己的ip直接访问,而是使用一个虚假的代理身份去访问,一旦被封我只需要换个ip就好,不会干扰我的正常使用。

网址

提供代理服务器获取的常用网站地址如下,后续可能不可用。

  • www.xicidaili.com(西刺代理)
  • www.goubanjia.com(goubanjia)

这里很多短时间的免费的,对于玩玩爬虫的可以使用,如果你是专业的爬虫工程师那么建议你购买相关的代理服务。

代理IP池

前面我们已经介绍了两种常用的访问模块的代理使用方法,但是每次使用都要到网站中去找到一个合适的,这很不方便,看了一些博客决定建立一个模块作为代理ip的自动获取-代理ip池。
我们想要实现的功能是,只要在需要的时候导入这个模块调用get方法就会得到一个可用的ip代理地址

这里的代理ip池是获取的goubanjia上的最新20个代理ip足够爬虫爱好者使用,专业爬虫工程师可以购买服务,爬取更多内容。

步骤

经过元素的审查分析,可以通过元素定位和拼接得到20个ip地址。
但是有三个难点:

  • 1:观察源代码出现这样的前后一样数值但是属性为不显示的干扰性,在获得源码并定位标签的基础上利用正则表达式替换掉了这样的p标签为空字符。如<p style="display: none;">5</p>
  • 2: 还有一个难点是如果使用的urllib或者是requests模块那么最后的端口号是没有js加载前的,是不准确的,这里笔者未选择进行js代码研究,而是使用selenium直接获得js加载后的源码。
  • 3: 即使剔除了干扰项,ip地址还是分立存放的,这里使用xpath的string方法获得所有的文本合并值。

编码

import time
from bs4 import BeautifulSoup
from lxml import etree
from selenium import webdriver
import re# 获得一组可能可用的代理ip地址
def getproxy():# 目标地址target_url = "http://www.goubanjia.com/"# 使用谷歌浏览器driver = webdriver.Chrome(r'C:\Users\16957\AppData\Local\Google\Chrome\Application\chromedriver.exe')# 等待js加载time.sleep(1)# 访问地址driver.get(target_url)# 得到html文件target_html = driver.page_source# 建立bs对象bs = BeautifulSoup(target_html, 'html.parser')# 找到了20个存放地址的td标签rst_etree = bs.find_all(attrs={'class': 'ip'})index = 0addr_list = []# 遍历每一个tdwhile index < len(rst_etree):rst_etree[index] = str(rst_etree[index])# 用l存放所有网页分析干扰项的p标签list_p = re.compile(r'<p.*?>[^<]*?</p>').findall(rst_etree[index])# 将所有p标签替换为空字符for item in list_p:rst_etree[index] = rst_etree[index].replace(item, "")# 通过etree里的xpath中的string方法获得ip地址dom = etree.HTML(rst_etree[index])ip_addr = ''ip_addr += dom.xpath("string(.)")addr_list.append(ip_addr)index += 1# 得到最新的代理ip列表return addr_listdef check_ip(ip_list=[]):# 使用request验证ip可用性import requestsfor item in ip_list:proxies = {"http": item,"https": item}# 如果连接成功,且返回来内容认为ip可用,返回该ip退出循环try:rsp = requests.get("http://www.baidu.com", proxies=proxies)if rsp.text is not None:return itembreakexcept Exception:pass# 如果20个遍历完没找到可用的ip,返回nonereturn None# 得到一个可用的ip地址
# 这个函数在其他地方导入该模块并且执行该函数就会返回一个可用的ip地址
def get_one_proxy_ip():ip_list = getproxy()if check_ip(ip_list) is not None:return check_ip(ip_list)else:return Noneif __name__ == '__main__':print(get_one_proxy_ip())

效果


可以看到我拿到了一个可用的代理ip,如果想同时使用多个可以修改源码或者多次请求该模块。

补充说明

爬虫的有效期是比较短的,后期如有问题,欢迎评论区指出。

Python爬虫-代理ip池建立相关推荐

  1. python 代理ip池_GitHub - xuan525/proxy_pool: Python爬虫代理IP池(proxy pool)

    ProxyPool 爬虫代理IP池 ______ ______ _ | ___ \_ | ___ \ | | | |_/ / \__ __ __ _ __ _ | |_/ /___ ___ | | | ...

  2. python 爬虫工具 butter_GitHub - TheButterflyOdor/proxy_pool: Python爬虫代理IP池(proxy pool)

    爬虫IP代理池 ______ ______ _ | ___ \_ | ___ \ | | | |_/ / \__ __ __ _ __ _ | |_/ /___ ___ | | | __/| _// ...

  3. ProxyPool 爬虫代理IP池(分享)

    GitHub - jhao104/proxy_pool: Python爬虫代理IP池(proxy pool)https://github.com/jhao104/proxy_pool/ProxyPoo ...

  4. python:从零开始教你建立爬虫代理ip池

    一.为什么需要建立爬虫代理ip池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑.在一段时间内被禁止访问.这种时候,可以 ...

  5. 如何建立爬虫代理ip池

    目录 一.为什么需要建立爬虫代理ip池 二.如何建立一个爬虫代理ip池 原文地址:https://www.cnblogs.com/TurboWay/p/8172246.html 一.为什么需要建立爬虫 ...

  6. Python搭建代理IP池(一)- 获取 IP

    使用爬虫时,大部分网站都有一定的反爬措施,有些网站会限制每个 IP 的访问速度或访问次数,超出了它的限制你的 IP 就会被封掉.对于访问速度的处理比较简单,只要间隔一段时间爬取一次就行了,避免频繁访问 ...

  7. Linux + ProxyPool 搭建属于爬虫代理IP池

    前言: 当爬虫达到一定速度时,大家都会遇到封Ip的情况,而搭建代理ip池是解决的最好方法,网络上有很多优秀的付费代理,但是作为白嫖党的我们又怎么能付钱那,本文将教会大家用一个成熟的开源项目搭建代理池. ...

  8. Python搭建代理IP池(三)- 检测 IP

    在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不可用分数就减 1,这样就可以实时改变每个代理的可用情况,在获 ...

  9. Python搭建代理IP池(二)- 存储 IP

    上一文写了如何从代理服务网站提取 IP,本文就讲解如何存储 IP,毕竟代理池还是要有一定量的 IP 数量才行.存储的方式有很多,直接一点的可以放在一个文本文件中,但操作起来不太灵活,而我选择的是 My ...

最新文章

  1. 设计模式: 自己手动实现一个观察者设计模式
  2. 你给我人脉,我给你全世界
  3. oracle中create table with as和insert into with as语句
  4. zookeeper的设计猜想-leader选举
  5. R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)
  6. 阿里云ECS在CentOS 6.9中使用Nginx提示:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported
  7. 【C语言】(for循环嵌套)找出1000以内的水仙花数
  8. golang配置环境排坑
  9. 5799元!OPPO Find X5 Pro天玑版即将开卖:性能比肩骁龙8
  10. fonts.googleapis.com加载过慢导致的项目启动过慢的问题
  11. Redis安装及HA(High Availability)配置
  12. 中孚保密检查客户端 完全卸载_保密检查工具 中孚保密检查清除工具
  13. oracle没有卸载,oracle卸载没有正确卸载怎么办?
  14. putty使用ssh登录时出现Access denied
  15. 简单工厂模式-实现简易计算器
  16. UE4读取steam sessionsetting中Value是亚洲文字时 乱码/ UE4 fix asian character garbled when get sessionsetting
  17. 263企业邮箱:客户端授权码登录
  18. 下载安装Tomcat8.5.30
  19. 老男孩第十四期Python学习班之Day02
  20. 外部js文件中调用pinia时,报错getActivePinia was called with no active Pinia. Did you forget to install pinia?

热门文章

  1. RocketMQ消息支持的模式-OrderProducer(顺序)
  2. 分布式架构的负载均衡算法
  3. Spring框架功能整体介绍
  4. 选择结构_标准if-else语句
  5. Hive的基本操作-基本查询语法
  6. 通过RocketMQ的java客户端api进行测试
  7. POI的入门:创建单元格设置数据
  8. 内置方法-str方法定制变量输出信息
  9. 非对称加密算法 - Java加密与安全
  10. redis设置开机自启动