Python 采集免费代理,并检测其是否可用

举报
梦想橡皮擦 发表于 2023/05/26 18:05:41 2023/05/26
【摘要】 本篇博客将采集互联网中公开代理 IP,并通过 IP 检测站点检测代理的可用性。未来该内容将会被集成到 爬虫训练场 中。 Python 采集免费代理 IP 模块准备与目标站点说明本次案例实战用到的 Python 第三方模块是 requests 和 lxml,从技术难度的角度看属于入门级爬虫。目标站点为:kuaidaili.com,其每日更新部分高匿名代理,可用于测试。 实战采集先看一下目标页面...

本篇博客将采集互联网中公开代理 IP,并通过 IP 检测站点检测代理的可用性。
未来该内容将会被集成到 爬虫训练场 中。

Python 采集免费代理 IP

模块准备与目标站点说明

本次案例实战用到的 Python 第三方模块是 requestslxml,从技术难度的角度看属于入门级爬虫。

目标站点为: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 篇原创博客

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。