讲师中心 微信公众号
AI工具推荐 视频效率加速

使用BeautifulSoup高效抓取多URL数据:避免覆盖与处理分页

小雪大大_3425

小雪大大_3425

发布时间:2025-12-05 11:46:18

|

728人浏览过

|

来源于php中文网

原创

使用BeautifulSoup高效抓取多URL数据:避免覆盖与处理分页

本教程旨在解决使用beautifulsoup从多个url抓取数据时,常见的数据覆盖问题。文章将详细阐述如何通过将每次循环获取的数据累积到列表中来有效存储,并进一步介绍如何结合循环逻辑处理网站分页,从而实现对目标网站全面且结构化的数据提取。

在进行网络数据抓取时,我们经常需要从多个相似的网页中提取信息。例如,从多个航空公司的评论页面抓取用户评价。然而,一个常见的陷阱是,当我们在循环中处理每个URL时,如果不对数据进行适当的累积,往往只会保留最后一个URL的数据,而之前的数据则会被覆盖。本文将深入探讨这一问题,并提供两种解决方案:一是通过列表累积数据,二是通过结合分页处理获取网站所有页面数据。

核心问题分析:数据覆盖的根源

原始代码片段展示了一个典型的错误:

for ending in endings:
    url = base_url + ending
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    results = soup.find('div', id='container') # 每次循环都会重新赋值
# ...
titles = results.find_all('h2', class_='text_header') # 每次循环都会重新赋值
# ...
for title in titles:
    print(title, end="\n"*2) # 仅打印当前(最后一次循环)的titles

问题出在 results 和 titles 这两个变量。在 for ending in endings: 循环的每次迭代中,它们都会被当前URL抓取到的新数据所覆盖。当循环结束后,results 和 titles 变量中存储的,仅仅是最后一个URL(在本例中是“alaska-airlines”)对应的数据。之前所有航空公司的数据都被丢弃了。

解决方案一:累积数据到列表

要解决数据覆盖问题,关键在于在循环开始前初始化一个空的数据结构(例如列表),然后在每次循环中将提取到的数据追加到这个结构中。这样,所有URL的数据都能被保存下来。

记录数据一键导出 Excel/CSV(带样式)
记录数据一键导出 Excel/CSV(带样式)

把记录数组导出为带样式的 Excel(xlsx) 或带 BOM 的 CSV。支持列配置(表头/宽度/顺序)、表头冻结首行、斑马纹、布尔值转「是/否」、数组换行、CSV 中文防乱码。零依赖。触发词:导出 Excel、导出 CSV、记录转表格、列配置导出、数据导出、表格美化、JSON 转表格。

下载

以下是使用列表累积数据的改进代码示例,它不仅解决了数据覆盖问题,还优化了数据提取方式,并增加了错误处理机制:

import requests
from bs4 import BeautifulSoup
import pandas as pd # 导入Pandas用于数据整理
import time # 导入time模块用于设置请求间隔

# 定义基础URL和航空公司后缀
base_url = 'https://www.airlinequality.com/airline-reviews/'
endings = ['american-airlines', 'delta-air-lines', 'united-airlines',
           'southwest-airlines', 'alaska-airlines']

# 初始化一个空列表,用于存储所有抓取到的评论数据
all_reviews_data = []

# 遍历每个航空公司的URL后缀
for ending in endings:
    url = base_url + ending
    print(f"正在抓取 {ending} ({url}) 的评论数据...")

    try:
        # 发送HTTP GET请求,并设置超时时间
        r = requests.get(url, timeout=10)
        # 检查请求是否成功(状态码200)
        r.raise_for_status() 
    except requests.exceptions.RequestException as e:
        print(f"请求 {url} 失败: {e},跳过当前航空公司。")
        time.sleep(1) # 请求失败也稍作等待
        continue # 跳过当前URL,继续处理下一个

    # 使用BeautifulSoup解析网页内容
    soup = BeautifulSoup(r.content, 'html.parser')

    # 使用CSS选择器更精确地定位评论区块
    # 'article[itemprop="review"]' 通常能定位到每个独立的评论容器
    reviews = soup.select('article[itemprop="review"]')

    if not reviews:
        print(f"在 {url} 未找到评论。")
        time.sleep(1)
        continue

    for review_item in reviews:
        # 提取评论标题
        title_element = review_item.h2
        title = title_element.text.strip() if title_element else "N/A"

        # 提取评论星级评分
        rating_element = review_item.select_one('span[itemprop="ratingValue"]')
        rating = rating_element.text.strip() if rating_element else "N/A"

        # 将提取到的数据以字典形式添加到列表中
        all_reviews_data.append({
            'airline': ending,
            'title': title,
            'rating': rating
        })

    time.sleep(2) # 设置请求间隔,避免对服务器造成过大压力

print("\n所有航空公司评论数据抓取完成。")

# 将列表转换为Pandas DataFrame,便于后续的数据分析、筛选和导出
df = pd.DataFrame(all_reviews_data)
print("部分抓取结果:")
print(df.head())
print(f"\n共抓取到 {len(df)} 条评论数据。")

代码解析与优化点:

  • all_reviews_data = []: 在循环外部初始化一个空列表,这是确保所有数据被收集的关键。
  • all_reviews_data.append({...}): 在内层循环中,每次成功提取一个评论的数据后,将其以字典的形式追加到 all_reviews_data 列表中。
  • soup.select('article[itemprop="review"]'): 相较于 find 和 find_all 的组合,使用CSS选择器 select (或 select_one) 通常更为简洁和高效,能够更精确地定位到目标元素。这里直接定位到每个带有 itemprop="review" 属性的 article 标签,这些标签通常是独立评论的容器。
  • 错误处理: 增加了 try-except requests.exceptions.RequestException 块来捕获网络请求可能出现的错误(如连接超时、DNS解析失败等),提高了代码的健壮性。
  • 数据清洗与健壮性: 使用 .strip() 清除文本两端的空白符。通过 if element else "N/A" 的方式,避免因某些元素不存在而导致程序崩溃,并用“N/A”填充缺失值。
  • 请求间隔: time.sleep(2) 在每次请求之间设置了2秒的延迟,这是爬虫的良好实践,有助于避免对目标网站造成过大压力,降低被封禁的风险。
  • Pandas DataFrame: 抓取到的结构化数据非常适合转换为Pandas DataFrame,这为后续的数据清洗、分析和导出(如保存为CSV、Excel文件)提供了极大的便利。

解决方案二:处理多页数据抓取

许多网站的数据是分页显示的。如果仅仅抓取每个航空公司的第一个页面,会遗漏大量信息。要获取所有页面的数据,我们需要在上述单页抓取的基础上,增加一个内部循环来遍历所有分页链接。

这通常涉及以下步骤:

  1. 构建初始页面的URL:明确每个航空公司第一页的URL结构。
  2. 内层 while True 循环:用于在找到“下一页”链接时持续抓取。
  3. 查找“下一页”链接:在当前页面解析HTML,找到指向下一页的链接元素。
  4. 更新URL并继续:如果找到“下一页”链接,则更新当前页面的URL为下一页的URL,并继续内层循环。
  5. 跳出循环:如果未找到“下一页”链接,则表示已到达最后一页,跳出内层循环,开始处理下一个航空公司。
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

base_url = 'https://www.airlinequality.com' # 注意这里是网站的根域名
endings = ['american-airlines', 'delta-air-lines', 'united-airlines',
           'southwest-airlines', 'alaska-airlines']

all_reviews_data_paginated = []

# 遍历每个航空公司
for ending in endings:
    # 构建当前航空公司的第一个页面的URL
    # 注意:网站分页URL结构可能不同,需根据实际情况调整
    current_page_url = f'{base_url}/airline-reviews/{ending}/page/1/?sortby=post_date%3ADesc&pagesize=100'
    page_num = 1
    print(f"\n开始抓取航空公司: {ending} 的多页评论数据...")

    while True:
        print(f"  正在抓取 {ending} 的第 {page_num} 页: {current_page_url}")

        try:
            r = requests.get(current_page_url, timeout=15)
            r.raise_for_status()
        except requests.exceptions.RequestException as e:
            print(f"  请求 {current_page_url} 失败: {e},跳过当前航空公司剩余页面。")
            break # 当前页面失败,跳出内层循环,尝试下一个航空公司

        soup = BeautifulSoup(r.content, 'html.parser')

        reviews = soup.select('article[itemprop="review"]')
        if not reviews:
            print(f"  在 {ending} 第 {page_num} 页未找到评论,可能已到达最后一页或页面结构有变。")
            break # 如果当前页面没有评论,则认为已到末尾

        for review_item in reviews:
            title_element = review_item.h2
            rating_element = review_item.select_one('span[itemprop="ratingValue"]')

            title = title_element.text.strip() if title_element else "N/A"
            rating = rating_element.text.strip() if rating_element else "N/A"

            all_reviews_data_paginated.append({
                'airline': ending,
                'title': title,
                'rating': rating,
                'page': page_num # 记录数据来源页码
            })

        # 查找“下一页”链接
        # 示例中提供的是 'article.comp_reviews-pagination ul li

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

更多
Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

693

2023.11.13

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

771

2026.04.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2741

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

376

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

417

2026.01.06

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn