python爬取免费代理并验证代理是否可用

针对 “python爬取免费代理并验证代理是否可用” 这个话题,我来给您详细讲解一下攻略。

1. 爬取免费代理

要爬取免费代理,我们可以利用 requests 库来发起网络请求。我们可以以 快代理 为例,代码如下所示:

import requests
from bs4 import BeautifulSoup


def get_proxies(url):
    # 发起请求
    response = requests.get(url)
    # 解析html
    soup = BeautifulSoup(response.text, 'html.parser')
    # 获取代理table对象
    table = soup.find('table', attrs={'class': 'table table-bordered table-striped'})
    trs = table.find_all('tr')
    # 列表推导式获取代理IP和端口号
    proxies = [':'.join([td.text.strip() for td in tr.select('td.text-center')[0:2]])
               for tr in trs[1:]]
    return proxies


if __name__ == '__main__':
    url = 'https://www.kuaidaili.com/free/'
    proxies = get_proxies(url)
    print(proxies)

以上代码中,我们先调用 requests.get(url) 方法发起网络请求,然后使用 BeautifulSoup 将页面的 html 格式进行解析,然后获取代理table对象,再进行解析。

2. 验证代理是否可用

通常情况下,爬取到的代理并不能保证都是可用的,所以需要对代理进行验证。我们可以使用 requests.get() 来发起一个基于代理的请求,来验证当前代理是否可用。代码如下所示:

import requests


def check(ip_port):
    print('checking: ', ip_port)
    proxies = {
        'http': 'http://' + ip_port,
        'https': 'https://' + ip_port,
    }
    try:
        response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)
        if response.status_code == 200:
            print(ip_port, 'works')
            return True
    except:
        print(ip_port, 'does not work')
        return False


if __name__ == '__main__':
    ip_port = '119.84.84.49:80'
    check(ip_port)

以上代码中,我们首先构造了一个代理字典 proxies,然后调用 requests.get() 方法发送一个基于代理的请求。如果返回的状态码为 200,则说明代理可用。

示例说明

我们使用上述两个方法来爬取免费代理,并验证代理是否可用,完整代码如下:

import requests
from bs4 import BeautifulSoup
import threading


def get_proxies(url):
    # 发起请求
    response = requests.get(url)
    # 解析html
    soup = BeautifulSoup(response.text, 'html.parser')
    # 获取代理table对象
    table = soup.find('table', attrs={'class': 'table table-bordered table-striped'})
    trs = table.find_all('tr')
    # 列表推导式获取代理IP和端口号
    proxies = [':'.join([td.text.strip() for td in tr.select('td.text-center')[0:2]])
               for tr in trs[1:]]
    return proxies


def check(ip_port):
    proxies = {
        'http': 'http://' + ip_port,
        'https': 'https://' + ip_port,
    }
    try:
        response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)
        if response.status_code == 200:
            print(ip_port, 'works')
            return True
    except:
        print(ip_port, 'does not work')
        return False


if __name__ == '__main__':
    threading_list = []

    # 爬取所有页码的代理
    for i in range(1, 10):
        url = 'https://www.kuaidaili.com/free/inha/' + str(i) + '/'
        proxies = get_proxies(url)

        # 验证代理是否可用
        for proxy in proxies:
            threading_list.append(threading.Thread(target=check, args=(proxy,)))

    # 启动所有线程
    for t in threading_list:
        t.start()

    # 等待所有线程执行完毕
    for t in threading_list:
        t.join()

以上代码中,我们定义了两个方法 get_proxies()check(),并创建了多个线程,用于爬取多页代理信息,以及验证代理是否可用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python爬取免费代理并验证代理是否可用 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JavaScript判断对象是否为数组

    当我们需要判断一个对象是否为数组时,JavaScript提供了多种方法来实现。 方法一:使用Array.isArray方法 Array.isArray可以判断传入的参数是否为数组,返回值为布尔型。 示例一: const arr = [1, 2, 3]; const notArr = ‘not an array’; console.log(Array.isAr…

    JavaScript 2023年5月27日
    00
  • js利用FileReader读取本地文件或者blob方式

    接下来我将详细讲解使用JavaScript中的FileReader对象来读取本地文件或Blob对象的方法。 FileReader对象简介 FileReader对象是WebAPI中的一个对象,用于读取本地文件中的数据。它提供了一种异步方式来读取文件,并且支持大量的文件类型。我们可以使用FileReader对象将文件读取为文本、DataURL或ArrayBuff…

    JavaScript 2023年5月27日
    00
  • JavaScript中的对象的extensible属性介绍

    JavaScript中的对象有一个extensible属性,它控制对象是否可以添加新的属性。如果一个对象的extensible属性被设置为false,那么它就不能添加新的属性了,一旦试图添加就会导致错误。这一特性在某些时候是非常有用的,例如需要保护一个对象不被其他代码修改时。 判断对象是否可扩展 可以使用Object.isExtensible(obj)方法来…

    JavaScript 2023年5月27日
    00
  • 基于JavaScript实现跳转提示页面

    本文将详细讲解如何基于JavaScript实现跳转提示页面。 1. 前置知识 在了解 JavaScript 实现跳转提示页面之前,您需要了解以下知识: HTML 基础知识 JavaScript 基础知识 网页跳转相关知识 2. 实现步骤 2.1 编写 HTML 页面 首先,我们需要编写一个 HTML 页面,用于展示跳转提示内容。以下是一个简单的示例: &lt…

    JavaScript 2023年6月11日
    00
  • javascript常用经典算法详解

    JavaScript常用经典算法详解 一、算法的基本概念 算法是指解决问题的方法和步骤,是计算机的灵魂。在学习编程的过程中,了解算法是非常重要的,因为它不仅是编写高效程序的关键,而且它还可以帮助我们更好地理解计算机语言。 1.1 算法的特点 有穷性:算法的操作是有限的,能被执行的步数是有限的。 确定性:算法中的每个操作都是确定的,不会出现二义性。 可行性:算…

    JavaScript 2023年5月18日
    00
  • js实现鼠标悬浮框效果

    JavaScript 实现鼠标悬浮框效果的过程主要分为以下几步: 1. 创建 HTML 结构 首先需要在 HTML 中定义框架,例如容器、容器内的内容、触发事件的 DOM 元素等。其中包含一个容器作为悬浮框,在鼠标触发事件后自动显示,同时鼠标移出事件后自动隐藏。 例如: <div class="parent"> <but…

    JavaScript 2023年6月11日
    00
  • JavaScript 对象深入学习总结(经典)

    关于“JavaScript 对象深入学习总结(经典)”的完整攻略,我们可以将其分成以下几个部分进行讲解: 1. 对象的定义 在 JavaScript 中,对象是一种复合数据类型,它是由属性和方法组成的实例。对象可以看作是一个容器,它可以存储数据和方法。对象在 JavaScript 中非常重要,几乎所有的应用都离不开对象。 对象的定义方式有两种,一种是使用对象…

    JavaScript 2023年5月18日
    00
  • html的DOM中Event对象onblur事件用法实例

    来详细讲解一下“html的DOM中Event对象onblur事件用法实例”的攻略。 什么是DOM中的onblur事件? 在HTML文档中,有许多事件是与用户的交互相关的,比如说鼠标单击、键盘按键、文本输入等等。其中有一个常用的事件是onblur,表示焦点离开了一个元素。 当某个HTML元素失去焦点时,就会触发onblur事件。例如,用户在一个输入框中输入完内…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部