Python爬取代理IP
在一些网页的内容爬取过程中,有时候在单位时间内如果我们发送的请求次数过多,网站就可能会封掉我们的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相关推荐
- python爬取代理IP并进行有效的IP测试
爬取代理IP及测试是否可用 很多人在爬虫时为了防止被封IP,所以就会去各大网站上查找免费的代理IP,由于不是每个IP地址都是有效的,如果要进去一个一个比对的话效率太低了,我也遇到了这种情况,所以就直接 ...
- 记一次用Python爬取代理IP并使用(尝试用代理IP制造直播房间访问量)
前言 首先说一下代理IP的用法途(代码中会有涉及):代理IP可以用来隐藏你的真实IP,你访问网站是通过代理服务器来做一个中转,所以目标服务器只能看到代理服务器的IP地址,这样就可以让你的IP地址实现隐 ...
- python爬取国内代理ip_Python语言爬取代理IP
本文主要向大家介绍了Python语言爬取代理IP,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. #!/usr/bin/env python #-*-coding=utf-8 -* ...
- 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)
系列 [实用工具系列之爬虫]python实现爬取代理IP(防 '反爬虫') [实用工具系列之爬虫]python实现快速爬取财经资讯(防 '反爬虫') 本文使用python实现代理IP的爬取,并可以防' ...
- 带你用Python爬取代理
带你用Python爬取代理 第一步 导入库: import requests,xml.etree.ElementTree as ET 说明: Requests:请求库,用于请求API网址 xml.et ...
- Python爬虫简单运用爬取代理IP
功能1: 爬取西拉ip代理官网上的代理ip 环境:python3.8+pycharm 库:requests,lxml 浏览器:谷歌 IP地址:http://www.xiladaili.com/gaon ...
- Python爬取代理池并清洗可用IP
本次是一个临时项目,因为需要代理IP进行项目中的测试,所以本次只是写了一个高耦合性的脚本. 我比较喜欢使用虚拟解释器,整理三方库比较清晰 依赖安装 pip install requests pip i ...
- python 爬取公开IP代理
import queue import time from threading import Thread from lxml import etree import re import reques ...
- 从西刺代理爬取代理ip,并验证是否可用
最近又重新拾起了久违的爬虫,写了一个代理ip的爬取,验证和存储器. 1.爬取网站是西刺代理,使用了requests+beautifulsoup库 2.验证的网站使用了京东和淘宝的首页,用了urllib ...
最新文章
- Android下添加新的自定义键值和按键处理流程【转】
- 一个注解搞懂 Sentinel,@SentinelResource总结
- 【转】首次敏捷项目开发实践
- 天池 在线编程 区分用户名(哈希)
- 【python】lambda函数
- java中class文件如何加载的_jvm如何加载class文件
- java程序执行顺序
- 织梦采集插件,无需采集规则,补损值
- 计算机word文档工作区名称,word文档界面名称 word文档的界面组成
- here i am(歌手BryanAdams的歌曲)
- 在 Android Studio 里面运行标准 Java 工程
- 数据库防火墙:数据库防火墙的阻断方式
- 《DSP using MATLAB》Problem 7.36
- JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK15特性讲解】
- 利用VB批量增加行高,解决Excel打印字体显示不全问题
- js几种escape()解码与unescape()编码
- 集线器、交换机以及路由器异同 + 冲突域和广播域详解
- vps服务技术的5大优势
- 尤瓦尔·赫拉利 | 认识你自己,不要被算法操控
- JavaMail附件中文名称乱码
热门文章
- 学 Python 必须关注的一位干货王
- 1345 - 玫瑰花圃
- 几个免费的国外php空间
- 点石互动--石头之:黑帽高调,聪明还是愚蠢?
- 点石互动--Zac之:SEO本能发挥效力
- CQRS vs CRUD
- vue 3.0 keep-alive 失效 报错 Cannot read properties of null (reading ‘parentNode‘)
- java 泛型 t extends_Java 之泛型通配符 ? extends T 与 ? super T 解惑
- 处理大量数据高并发大流量请求解决方案
- 聊聊我对测试开发岗的理解