在一些网页的内容爬取过程中,有时候在单位时间内如果我们发送的请求次数过多,网站就可能会封掉我们的IP地址,这时候为了保证我们的爬虫的正常运行,我们就要使用代理IP。

下面来介绍如何构建自己的IP池。

我们用快代理来获取代理ip地址:国内高匿免费HTTP代理IP - 快代理

通过lxml模块的etree,我们很快就可以通过网页源码来获取储存代理ip地址和端口以及IP类型的标签,对它们的爬取也不是一件难事。

IP爬到后接下来我们要验证我们爬取的IP是否是真正有效的,毕竟作为免费的IP,有效性还是不高的,需要我们进一步的甄别。

在这里我再分享一个网站:

http://icanhazip.com/

通过访问这个网站,我们可以得到自己当前的IP地址,由此我们可以根据访问该网站得到的返回数据与我们使用的代理IP进行对比观察是否相同,就可以判断我们爬取的代理IP是否有效了。

下面是完整代码:

import requests
from lxml import etree
import timeheaders = {"User-Agent": "mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"}def get_ips():ls = []ipps = []for i in range(1, 3):url = f"https://free.kuaidaili.com/free/inha/{i}/"page = requests.get(url=url, headers=headers).texttree = etree.HTML(page)ips = tree.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')for i in ips:try:ip = "http://" + i.xpath('./td[@data-title="IP"]/text()')[0] + ":" + \i.xpath('./td[@data-title="PORT"]/text()')[0]ipps.append(ip)except:continuetime.sleep(1)ipps = list(set(ipps))for ip in ipps:dic = {}dic["http"] = ipls.append(dic)return lsdef check_ips(ls):url = 'http://icanhazip.com/'for i in ls[::-1]:try:r = requests.get(url=url, headers=headers, proxies=i,timeout=5)r.raise_for_status()if r.text[:13]==i['http'][7:20]:continueelse:ls.remove(i)except:ls.remove(i)return lsdef ips():a=get_ips()b=check_ips(a)return bif __name__ == '__main__':print(ips())

上述代码我仅爬取快代理网站的前两页IP内容,如需更多,可更改get_ips()函数第一个for循环的次数。但是这种方法也有一个弊端,我是一页一页的爬取,然后把爬取的代理IP一个一个的判断,速度会慢下来不少。为了更高效的爬取,我们可以导入线程池,在爬取和验证的过程中均导入线程池,可以让我们爬取的速度成倍增长。

import requests
from lxml import etree
from multiprocessing.dummy import Poolheaders = {"User-Agent": "mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"}
ls=[]
ipps=[]def get_ips(a):url = f"https://free.kuaidaili.com/free/inha/{a}/"page = requests.get(url=url, headers=headers).texttree = etree.HTML(page)ips = tree.xpath('//table[@class="table table-bordered table-striped"]/tbody/tr')for i in ips:try:ip = "http://" + i.xpath('./td[@data-title="IP"]/text()')[0] + ":" + \i.xpath('./td[@data-title="PORT"]/text()')[0]ipps.append(ip)except:continuepool_1=Pool(2)
pool_1.map(get_ips,list(range(1,3)))
pool_1.close()
pool_1.join()for ip in list(set(ipps)):dic={}dic['http']=ipls.append(dic)
print(len(ls))def check_ips(i):url = 'http://icanhazip.com/'try:r = requests.get(url=url, headers=headers, proxies=i,timeout=5)r.raise_for_status()if r.text[:13]==i['http'][7:20]:passelse:ls.remove(i)except:ls.remove(i)pool_2=Pool(15)
pool_2.map(check_ips,ls)
pool_2.close()
pool_2.join()if __name__ == '__main__':print(ls)

爬取前两页的代理IP,可以发现,基本上每5个代理IP中仅有1个是有用的,但毕竟这是免费的,我们仅仅是增加了一步验证的过程,总的来说,还是非常不错的。

Python爬取代理IP相关推荐

  1. python爬取代理IP并进行有效的IP测试

    爬取代理IP及测试是否可用 很多人在爬虫时为了防止被封IP,所以就会去各大网站上查找免费的代理IP,由于不是每个IP地址都是有效的,如果要进去一个一个比对的话效率太低了,我也遇到了这种情况,所以就直接 ...

  2. 记一次用Python爬取代理IP并使用(尝试用代理IP制造直播房间访问量)

    前言 首先说一下代理IP的用法途(代码中会有涉及):代理IP可以用来隐藏你的真实IP,你访问网站是通过代理服务器来做一个中转,所以目标服务器只能看到代理服务器的IP地址,这样就可以让你的IP地址实现隐 ...

  3. python爬取国内代理ip_Python语言爬取代理IP

    本文主要向大家介绍了Python语言爬取代理IP,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. #!/usr/bin/env python #-*-coding=utf-8 -* ...

  4. 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)

    系列 [实用工具系列之爬虫]python实现爬取代理IP(防 '反爬虫') [实用工具系列之爬虫]python实现快速爬取财经资讯(防 '反爬虫') 本文使用python实现代理IP的爬取,并可以防' ...

  5. 带你用Python爬取代理

    带你用Python爬取代理 第一步 导入库: import requests,xml.etree.ElementTree as ET 说明: Requests:请求库,用于请求API网址 xml.et ...

  6. Python爬虫简单运用爬取代理IP

    功能1: 爬取西拉ip代理官网上的代理ip 环境:python3.8+pycharm 库:requests,lxml 浏览器:谷歌 IP地址:http://www.xiladaili.com/gaon ...

  7. Python爬取代理池并清洗可用IP

    本次是一个临时项目,因为需要代理IP进行项目中的测试,所以本次只是写了一个高耦合性的脚本. 我比较喜欢使用虚拟解释器,整理三方库比较清晰 依赖安装 pip install requests pip i ...

  8. python 爬取公开IP代理

    import queue import time from threading import Thread from lxml import etree import re import reques ...

  9. 从西刺代理爬取代理ip,并验证是否可用

    最近又重新拾起了久违的爬虫,写了一个代理ip的爬取,验证和存储器. 1.爬取网站是西刺代理,使用了requests+beautifulsoup库 2.验证的网站使用了京东和淘宝的首页,用了urllib ...

最新文章

  1. Android下添加新的自定义键值和按键处理流程【转】
  2. 一个注解搞懂 Sentinel,@SentinelResource总结
  3. 【转】首次敏捷项目开发实践
  4. 天池 在线编程 区分用户名(哈希)
  5. 【python】lambda函数
  6. java中class文件如何加载的_jvm如何加载class文件
  7. java程序执行顺序
  8. 织梦采集插件,无需采集规则,补损值
  9. 计算机word文档工作区名称,word文档界面名称 word文档的界面组成
  10. here i am(歌手BryanAdams的歌曲)
  11. 在 Android Studio 里面运行标准 Java 工程
  12. 数据库防火墙:数据库防火墙的阻断方式
  13. 《DSP using MATLAB》Problem 7.36
  14. JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK15特性讲解】
  15. 利用VB批量增加行高,解决Excel打印字体显示不全问题
  16. js几种escape()解码与unescape()编码
  17. 集线器、交换机以及路由器异同 + 冲突域和广播域详解
  18. vps服务技术的5大优势
  19. 尤瓦尔·赫拉利 | 认识你自己,不要被算法操控
  20. JavaMail附件中文名称乱码

热门文章

  1. 学 Python 必须关注的一位干货王
  2. 1345 - 玫瑰花圃
  3. 几个免费的国外php空间
  4. 点石互动--石头之:黑帽高调,聪明还是愚蠢?
  5. 点石互动--Zac之:SEO本能发挥效力
  6. CQRS vs CRUD
  7. vue 3.0 keep-alive 失效 报错 Cannot read properties of null (reading ‘parentNode‘)
  8. java 泛型 t extends_Java 之泛型通配符 ? extends T 与 ? super T 解惑
  9. 处理大量数据高并发大流量请求解决方案
  10. 聊聊我对测试开发岗的理解