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

yizhihongxing

针对 “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垃圾回收机制的理解

    关于 JS 垃圾回收机制的理解,可以从下面三个方面来进行说明: 什么是垃圾回收? 垃圾回收是一种自动化的过程,它主要的功能是自动找出不再被程序所使用的内存,然后释放这些内存资源。JS 中的垃圾回收,就是通过一些算法来进行自动的垃圾回收。 垃圾回收的算法 垃圾回收器通过检查数据的引用,找出不再被引用的变量,然后进行垃圾回收操作。JS 垃圾回收是基于算法原理的。…

    JavaScript 2023年6月11日
    00
  • 原生js开发的日历插件

    原生JS开发日历插件的完整攻略包含以下几个步骤: 1. 确定需求和功能 在开发日历插件之前,我们需要确定该插件所需实现的功能和需求,如:显示当前日历、搜索指定日期、显示日程安排等等。 2. 设计日历插件的界面 根据我们的需求和功能,我们可以开始设计日历插件的整体界面和交互效果。可以考虑使用HTML/CSS来实现,同时要考虑兼容性和响应式设计。 3. 实现日历…

    JavaScript 2023年6月11日
    00
  • Angular ElementRef简介及其使用

    Angular ElementRef是Angular中一个重要的类,它主要用于在组件中获取对应的DOM元素,从而能够操作它们的属性、样式和事件等。 ElementRef的基本用法 使用ElementRef很简单,只需要在组件中注入相应的服务即可。注入之后,我们就可以在组件中使用它了。例如: import { Component, ElementRef } f…

    JavaScript 2023年6月10日
    00
  • Javascript实现购物车功能的详细代码

    当我们需要实现网页购物车时,JavaScript代码是必不可少的。下面是实现购物车功能的详细步骤: 1.创建HTML文件 首先,我们需要创建HTML文件,其中包含购物车图标、商品信息、价格和数量等。可以使用表格、列表或其他HTML元素来构建这个网页。 2.引入JavaScript代码 在HTML文件中,我们需要引入JavaScript代码,使用<scr…

    JavaScript 2023年6月10日
    00
  • JavaScript调试技巧之console.log()详解

    JavaScript调试技巧之console.log()详解 什么是console.log()? console.log()是JavaScript内置的一种调试技巧,它可以将指定的消息输出到浏览器的控制台(Console)上。其中“log”是“日志”的意思,所以console.log()可以理解为输出日志信息。 使用console.log()可以输出Java…

    JavaScript 2023年5月28日
    00
  • JavaScript 基础问答三

    JavaScript 基础问答三包含以下问题: 什么是事件循环?请简单描述它的机制。 JavaScript 中的 this 是什么?它有哪些应用场景? 请简单描述下 promise 的用法。 如何判断一个变量是数组类型?请写出代码示例。 下面是针对这些问题的完整攻略: 1. 什么是事件循环?请简单描述它的机制。 事件循环是指 JavaScript 引擎中的一…

    JavaScript 2023年5月18日
    00
  • js日期插件dateHelp获取本月、三个月、今年的日期

    要获取本月、三个月、今年的日期,可以使用JS日期插件dateHelp。下面是使用dateHelp的完整攻略: 步骤一:引入dateHelp插件 在HTML文件中,引入dateHelp.js。 <script src="path/to/dateHelp.js"></script> 步骤二:获取本月日期 要获取本月日期…

    JavaScript 2023年6月10日
    00
  • JavaScript setinterval延迟一秒解决方案

    当我们在使用JavaScript代码的时候,我们可能会遇到需要执行定时任务的情况。而在一些情况下,我们需要在定时任务中等待一定的时间,再执行后续的操作。这时就可以使用setInterval延迟一定时间进行操作。但是,要注意setInterval不是严格间隔时间执行,而是间隔一段时间后才会执行。下面是针对“JavaScript setInterval延迟一秒解…

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