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

Posted 梦想橡皮擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 采集免费代理,并检测其是否可用相关的知识,希望对你有一定的参考价值。

本篇博客将采集互联网中公开代理 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 是否可以,我们会使用到下述两个站点:

  • https://ipv4.icanhazip.com/
  • http://httpbin.org/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 篇原创博客

全网 6000+人正在学习的 爬虫专栏 👇👇👇👇

以上是关于Python 采集免费代理,并检测其是否可用的主要内容,如果未能解决你的问题,请参考以下文章

Python获取免费的可用代理

python 爬虫proxy,BeautifulSoup+requests+mysql 爬取样例

关于py的mysql检测代理是否可用的小案例

爬虫怎么解决IP不足的问题?

Python爬虫采集遇到403问题怎么办?

python代理可用检测代理类型检测