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入门基础 document.write输出

    让我来详细讲解一下“第一个JavaScript入门基础 document.write输出”的完整攻略: 前言 JavaScript 是一种解释性的脚本语言,通常用于网页开发中,但也可以用于服务器端开发等其他领域。我们可以通过在 HTML 文件中添加 <script> 标签来引用 JavaScript 代码,并让浏览器执行 JavaScript 代…

    JavaScript 2023年5月28日
    00
  • JS实现数组过滤从简单到多条件筛选

    下面是JS实现数组过滤从简单到多条件筛选的完整攻略。 一、简单数组过滤 在JS中,可以使用数组的filter()方法来实现简单的数组过滤。该方法接受一个回调函数作为参数,该回调函数的返回值为true或false,用于决定每个元素是否要留下。 下面是一个简单的示例,演示如何根据指定的条件过滤数组中的元素: const fruits = [‘apple’, ‘b…

    JavaScript 2023年5月27日
    00
  • xmlplus组件设计系列之路由(ViewStack)(7)

    《xmlplus组件设计系列之路由(ViewStack)(7)》是XMLPlus团队所编写关于ViewStack组件的一篇技术文章。该文章中详细介绍了如何设计ViewStack组件,并提供了示例代码和运行演示。下面是该文章的完整攻略: XMLPlus组件设计系列之路由(ViewStack)(7) 什么是ViewStack组件? ViewStack组件是一种可…

    JavaScript 2023年6月11日
    00
  • 微信小程序开发WXML模板语法基础教程

    下面是一份“微信小程序开发WXML模板语法基础教程”的完整攻略。 一、WXML模板语法基础 1. WXML是什么? WXML是微信小程序中的一种类似HTML的标记语言。它主要用于定义小程序的结构和内容,包括布局、组件以及数据绑定等等。 2. 基本语法 2.1 标签 WXML中的标签大多数都和HTML类似,比如div、input、image等等,用法也差不多。…

    JavaScript 2023年6月10日
    00
  • JS简单获得节点元素的方法示例

    下面我将为您详细讲解JS简单获得节点元素的方法示例的完整攻略。 核心概念 在JavaScript中,我们可以通过document对象的方法来获取节点元素,获取的节点元素可以是HTML、XML或是XHTML文档中的任何元素。document对象提供了多种获取节点元素的方法,常用的有getElementById()、getElementsByTagName()、…

    JavaScript 2023年6月10日
    00
  • 使用js实现将后台传入的json数据放在前台显示

    首先,在使用 JS 实现将后台传入的 JSON 数据放在前台显示之前,我们需要了解 JSON 的基本概念和用法。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以将复杂的数据结构序列化为字符串,方便进行传输和存储。在前端开发中,我们经常需要将后台返回的 JSON 数据通过 JavaScript 解析并渲染到页…

    JavaScript 2023年5月27日
    00
  • JS实现页面炫酷的时钟特效示例

    下面我将详细讲解如何使用JS实现页面炫酷的时钟特效。 第一步:HTML结构 首先,在HTML中创建一个时钟的容器,可以使用<div>标签包裹起来,为其添加一个id属性,以便JS能够准确定位到该元素。 <div id="clock"></div> 第二步:CSS样式 接着,为时钟容器添加CSS样式。我们可…

    JavaScript 2023年5月27日
    00
  • html的DOM中document对象images集合用法实例

    下面是关于“HTML的DOM中document对象images集合用法实例”的完整攻略: 什么是DOM中的document对象images集合 在HTML的DOM中,每个图片元素都被定义为标签。而通过document对象的images集合,我们可以获取到文档中的所有图片元素,并对其进行一系列的操作,比如更改图片路径、设置图片样式等等。 document对象i…

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