首页 > 编程语言 >使用Python爬取免费代理并测试其有效性

使用Python爬取免费代理并测试其有效性

时间:2024-10-12 19:47:42浏览次数:10  
标签:playwright 浏览器 Python Excel 抓取 爬取 table data 有效性

前言

在本篇文章中,我们将使用Python编写一个脚本来爬取免费的代理IP地址,并对其进行有效性测试。我们将会用到playwrightaiohttppandas等库来完成这个任务。最终我们会得到一个包含有效代理IP地址的列表,并将其保存到本地文件中。

1. 环境准备

首先,你需要确保你的Python环境中已经安装了以下库:

  • playwright
  • aiohttp
  • pandas
  • openpyxl

你可以通过pip命令来安装它们:

pip install playwright aiohttp pandas openpyxl

同时,对于playwright,你需要安装浏览器驱动程序:

playwright install

2. 代码解析

2.1 初始化设置

import random
import re
import asyncio
import aiohttp
import time
import pandas as pd
from playwright.sync_api import Playwright, sync_playwright, expect
from openpyxl import Workbook

# 添加一个变量来跟踪是否已经抓取过表格数据
table_data_fetched = False

在这段代码中,我们导入了必要的库,并定义了一个全局变量table_data_fetched,用于标记表格数据是否已经被抓取过。
目标网站:https://www.kuaidaili.com/free/inha/
在这里插入图片描述

2.2 抓取网页数据

def run(playwright: Playwright, wb: Workbook) -> None:
    global table_data_fetched  # 使用全局变量来跟踪表格数据是否已经被抓取
    browser = playwright.chromium.launch(headless=True)  # 启动无头浏览器
    context = browser.new_context()  # 创建新的浏览器上下文
    page = context.new_page()  # 打开新页面
    url = f"https://www.kuaidaili.com/free/inha/{
     num}/"  # 构建目标网页URL
    page.goto(url)  # 访问目标网页

这部分代码定义了一个名为run的函数,该函数接受Playwright实例和Workbook对象作为参数。它启动了一个无头浏览器,创建了一个新的浏览器上下文,并打开了一个新的页面。然后,它访问了一个特定的URL,该URL包含了代理服务器的数据。

2.2 抓取网页数据(续)

在上一部分中,我们看到了如何启动浏览器并访问目标网页。接下来的部分将展示如何抓取表格的表头和内容,并将它们写入Excel文件。

    # 如果表格数据未被抓取过,则执行抓取表头的操作
    if not table_data_fetched:
        headers = [header.inner_text() for header in
                   page.locator("#table__free-proxy > div > table > thead > tr > th").all()]  # 获取表头
        print(headers)
        ws = wb.active  # 获取活动工作表
        ws.append(headers)  # 将表头写入Excel文件

    # 获取表格数据
    table_data = []
    for row in page.locator("#table__free-proxy > div > table > tbody > tr").all():
        row_data = [cell.inner_text() for cell in row.locator("td").all()]  # 获取每行的数据
        table_data.append(row_data)

    print(table_data)
    ws = wb.active  # 再次获取活动工作表
    for row in table_data:
        ws.append(row)  # 将数据写入Excel文件

    table_data_fetched = True  # 标记为表格数据已被抓取

    context.close()  # 关闭浏览器上下文
    browser.close()  # 关闭浏览器

在这段代码中,如果table_data_fetched变量是False,则表示这是第一次抓取数据,需要先获取表格的表头。通过页面定位器选择器找到表头元素,并将其文本添加到headers列表中。然后将这些表头写入Excel文件的工作表中。

接着,程序遍历表格中的每一行,提取每个单元格的内容,并将这些内容组成一个列表,加入到table_data中。之后,将所有行数据写入Excel文件。

最后,设置table_data_fetchedTrue,表示已经抓取了表格数据,关闭浏览器上下文和浏览器实例。

2.3 创建Excel文件并抓取多页数据

# 创建一个新的 Excel 文件
wb = Workbook()

with sync_playwright() as playwright:  # 使用playwright同步API
    for num in range(101, 150):  # 遍历指定范围内的页码
        print(f"正在抓取第{
     num}页")
        run(playwright, wb)  # 调用run函数抓取数据
        time.sleep(random.uniform(7, 20))  # 添加随机延迟避免请求过于频繁
        with open("E:\\Python\\代理池\\kuaidai_proxy.xlsx", 'wb') as f:  # 保存Excel文件
            wb.save(f)

这里创建了一个新的Excel工作簿,并使用sync_playwright来管理Playwright的上下文。循环遍历指定范围内的页码(从101到149),对每一页调用run函数进行数据抓取。为了防止被网站封禁,每次抓取后都会随机暂停一段时间。最后,将Excel工作簿保存到本地文件。

2.4 读取Excel文件并生成代理地址

# 读取Excel文件
df = pd.read_excel("E:\\Python\\代理池\\kuaidai_proxy.xlsx")

# 循环遍历数据,并生成代理地址
proxies = []
for index, row in df.iterrows():  # 遍历DataFrame中的每一行
    ip = row['IP']  # 假设IP所在列名为'IP'
    port = row['PORT']  # 假设端口号所在列名为'Port'
    proxy = f'http://{
     ip}:{
     port}'  # 生成代理地址
    proxies.append(proxy)

# 将代理地址列表写入到本地文本文件
file_path = "E:/Python/代理池/proxies.txt"

def save_proxies_to_file(proxies, file_path

标签:playwright,浏览器,Python,Excel,抓取,爬取,table,data,有效性
From: https://blog.csdn.net/2301_78198846/article/details/142884689

相关文章

  • python统计人的视角(1)——python基础
    3D画图importmatplotlibimportmatplotlib.pyplotaspltimportnumpyasnpfig=plt.figure()ax=fig.add_subplot(111,projection="3d")x=np.arange(-10,10,0.5)y=np.arange(-10,10,0.5)X,Y=np.meshgrid(x,y)Z=X**2+Y**2ax.plot_wireframe(X,Y,......
  • python怎么引用文件
    新建python文件:在同目录lib下创建mylib.py和loadlib.py两个文件。在mylib.py文件中创建一个Hello的类,并且给这个类添加一个sayHello的方法,让它输出hellopython在loadlib.py文件中引入mylibimport mylib在loadlib中调用引用过来的python文件mylib.py中的Hello......
  • python3 mysql 连接
    python3mysql连接脚本#-*-coding:utf-8-*-#importMySQLdb,sys,osimportpymysqlasMySQLdb,sys,osimportos,sys,traceback#importMySQLdb.cursors#importmysql.connectordefsingleton(cls):instances={}defget_instance():ifcls......
  • 【python-数据分析】pandas时间序列处理
    1.timestamp1.1创建timestamp自定义timestamp语法:pd.Timestamp(ts_input,tz,year,month,day,hour,minute,second,microsecond,nanosecond,tzinfo)代码示例:importpandasaspdimportpytz#当ts_input为字符串时,一般要与tz参数搭配使用timestamp=pd.Timestamp(ts......
  • 【python-日期和时间处理】datetime模块基本使用
    1.获取datetime对象获取当前datetime对象方法:datetime.now(cls,tz=None)->datetime参数说明:tz:时区信息,不传该参数时,默认使用当地时区示例代码:now=datetime.now()print(now)#2023-01-0509:38:43.084062print(type(now))#datetime.datetime如果需......
  • 【python-数据分析】pandas数据提取
    importpandasaspd1.直接索引df=pd.DataFrame({'AdmissionDate':['2021-01-25','2021-01-22','2021-01-20','2021-01-18','2021-01-17','2021-01-17','2021-01-2......
  • 【python日期和时间处理】time模块基本使用
    1.time模块中三种时间格式时间戳time模块获取各种精度的时间戳importtimetimestamp=time.time()timestamp_s=int(time.time())#s精度timestamp_ms=int(time.time()*1000)#ms精度timestamp_us=int(time.time()*1000_000)#μs精度timestamp_ns=t......
  • python __new__和__init__的区别
    简介__new__和__init__都是Python中的特殊方法,它们在对象生命周期中起到不同的作用。用法1、__new__方法:__new__是一个静态方法,用于创建一个新的对象实例。当你调用一个类时,__new__方法是第一个被调用的方法。它的主要任务是分配内存空间,并返回一个新创建的对象实例。通常情况......
  • python 实现工厂类方法
    #工厂类方法1,这些类的实例方法名相同classFruit(object):def__init__(self):passdefprint_color(self):pass#工厂类方法2classApple(Fruit):def__init__(self):passdefprint_color(self):print("applei......
  • 一文了解Python反射机制(很详细)
    https://blog.csdn.net/weixin_40025666/article/details/134456717 https://www.cnblogs.com/mengdie1978/p/17425581.html 一、反射的概念python的反射机制,核心就是利用字符串去已存在的模块中找到指定的属性或方法,找到方法后自动执行——基于字符串的事件驱动。二、熟悉......