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日

相关文章

  • js Math数学简单使用操作示例

    下面是关于“js Math数学简单使用操作示例”的完整攻略。 一、Math对象概述 JavaScript的内置对象之一是Math对象,它包含了许多常见的数学函数和常量。Math主要对数字进行操作,例如数学运算、幂运算、三角函数等。 二、Math对象中的常用方法 下面是 Math 对象中一些常用方法的介绍: 1. Math.floor() Math.floor…

    JavaScript 2023年5月27日
    00
  • 正则表达式创建方式的区别及编写简单的正则方式(js学习总结)

    让我来详细讲解一下“正则表达式创建方式的区别及编写简单的正则方式”的攻略。 区别 首先,我们需要了解正则表达式创建方式的区别。常见的正则表达式创建方式有以下三种: 字面量方式:使用斜杠(/)将正则表达式包裹起来,例如:/abc/ 构造函数方式:使用new RegExp()构造函数来创建正则表达式对象,例如:new RegExp(‘abc’) 工厂函数方式:使…

    JavaScript 2023年6月10日
    00
  • JavaScript的内置对象Date详解

    JavaScript的内置对象Date详解 1. Date对象概述 Date对象是JavaScript的内置对象,它封装了时间和日期相关的方法。使用Date对象,可以获取当前的日期和时间,还可以进行日期和时间的运算以及格式化输出。该对象提供的方法非常丰富,能够满足大部分与时间有关的需求。 2. 创建Date对象 Date对象可以通过以下两种方式进行创建: 2…

    JavaScript 2023年5月27日
    00
  • js创建对象的几种常用方式小结(推荐)

    下面是“js创建对象的几种常用方式小结(推荐)”的完整攻略。 1. 前言 在 JavaScript 中,创建对象是非常常见的操作之一。为了能够从不同的角度去看待对象创建的方式,不同的方法也应运而生。接下来,我们将会一一讨论对象创建方式的优缺点,以及使用场景。 2. 第一种常用方式:对象字面量 对象字面量是最常见和最简单的方式,由任意数量的“名称/值”对组成。…

    JavaScript 2023年5月27日
    00
  • JSP对URL链接中的中文乱码处理方法总结

    下面我将为您详细讲解“JSP对URL链接中的中文乱码处理方法总结”的完整攻略。 一、问题背景 在JSP中,当我们需要传递中文参数时,URL链接中的中文会出现乱码。这是因为URL中只支持ASCII码,而中文字符不属于ASCII码范围内。因此需要对中文参数进行编码处理,以保证URL链接能够正确传递中文参数。 二、解决方案 1、使用URLEncoder/URLDe…

    JavaScript 2023年5月19日
    00
  • HTML5+setCutomValidity()函数验证表单实例分享

    HTML5+setCustomValidity()函数是HTML5表单验证的一种手段,可以用于实现自定义的表单验证。它可以在用户提交表单之前,动态地对表单中的输入进行检验,通过返回值控制表单是否能够提交。以下是使用HTML5+setCustomValidity()函数进行表单验证的完整攻略。 1. 创建一个基本表单 首先,在HTML中创建一个表单,并添加一些…

    JavaScript 2023年6月10日
    00
  • 写出更好的JavaScript程序之undefined篇(中)

    针对“写出更好的JavaScript程序之undefined篇(中)”这篇文章,我来进行详细的讲解攻略,包括以下几个方面: 理解undefined的含义 undefined是JavaScript中的一个关键字,指的是一个变量或属性没有被赋值,或者被赋值为undefined。例如以下代码片段中的变量a和b都是undefined: var a; var b = …

    JavaScript 2023年5月27日
    00
  • vue中如何获取当前路由地址

    获取当前路由地址是我们在Vue开发中经常会用到的一个功能。可以通过Vue Router提供的$router.currentRoute属性来获取当前路由信息,包括路由地址、参数等。 首先需要在Vue组件中先引入Vue Router: import VueRouter from ‘vue-router’ Vue.use(VueRouter) 然后,就可以在Vue…

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