前言
在本篇文章中,我们将使用Python编写一个脚本来爬取免费的代理IP地址,并对其进行有效性测试。我们将会用到playwright
、aiohttp
、pandas
等库来完成这个任务。最终我们会得到一个包含有效代理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_fetched
为True
,表示已经抓取了表格数据,关闭浏览器上下文和浏览器实例。
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