本篇博客将采集互联网中公开代理 IP,并通过 IP 检测站点检测代理的可用性。
未来该内容将会被集成到 爬虫训练场 中。
Python 采集免费代理 IP
模块准备与目标站点说明
本次案例实战用到的 Python 第三方模块是 requests
和 lxml
,从技术难度的角度看属于入门级爬虫。
目标站点为:kuaidaili.com,其每日更新部分高匿名代理,可用于测试。
实战采集
先看一下目标页面代码采集的完整案例,然后再进行分析。
def get_proxy_list(i):
url = f"https://www.kuaidaili.com/free/inha/{i}/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
}
response = requests.request("GET", url, headers=headers)
res = []
elements = etree.HTML(response.text)
type_dct = {
"HTTP": "http://",
"HTTPS": "https://"
}
data_list = elements.xpath("//tbody/tr")
for data in data_list:
ip = data.xpath("./td[1]/text()")[0]
port = data.xpath("./td[2]/text()")[0]
type = data.xpath("./td[4]/text()")[0]
res.append(type_dct[type] + ip + ':' + port)
return res
get_proxy_list()
函数接收页码参数,将其拼接到 url
中,然后使用 requests.request()
方法构造请求,这里直接使用 requests.get()
也是可以的。
得到数据相应之后,直接采用 etree.HTML(response.text)
进行格式化操作,然后通过 xpath
将目标信息提取出来,存放到 res
列表中进行返回。
代理 IP 可用性检测
对接站点
检测代理 IP 是否可以,我们会使用到下述两个站点:
直接访问上述站点,都会得到如下内容,即展示你本地 IP 信息。
我们接下来通过 requests 模块设置代理 IP 访问上述站点,查看代理 I 怕是否可用。
def check(proxy):
href = 'https://ipv4.icanhazip.com'
# href = 'http://httpbin.org/ip'
if 'https' in proxy:
proxies = {'https': proxy}
else:
proxies = {'http': proxy}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4396.0 Safari/537.36'
}
try:
r = requests.get(href, proxies=proxies, timeout=3, headers=headers)
print(r.content)
if r.status_code == 200:
return True
except:
return False
上述代码最核心的是 requests.get()
,其中 proxies
参数设置为代理,timeout
设置请求超时时间,最后修改 main
入口函数部分代码。
if __name__ == '__main__':
for i in range(1, 5):
proxy_list = get_proxy_list(i)
print(proxy_list)
for p in proxy_list:
print(p, check(p))
再次运行代码,得到代理 IP 的状态。
如何代理 IP 可用,返回 True,否则返回 Flase。
实战中,会出现下述问题。
为何使用代理 IP,依旧展示原 IP
这个其实很好解释,免费代理并不是高匿名的,虽然免费站点会标记 IP 为高匿名代理,但这个不绝对。
如果我们使用的不是【真】高匿代理,那展示的就是你的真实 IP,检测代理 IP 还可以用 httpbin.org/ip ,这个站点没有设置反代理。
如果希望实现绝对的安全,可以使用 VPN 或者代理服务器进行请求,结果就会展示为你的代理 IP。
📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 849 篇原创博客