本教程旨在解决使用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的数据都能被保存下来。
以下是使用列表累积数据的改进代码示例,它不仅解决了数据覆盖问题,还优化了数据提取方式,并增加了错误处理机制:
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)} 条评论数据。")代码解析与优化点:
许多网站的数据是分页显示的。如果仅仅抓取每个航空公司的第一个页面,会遗漏大量信息。要获取所有页面的数据,我们需要在上述单页抓取的基础上,增加一个内部循环来遍历所有分页链接。
这通常涉及以下步骤:
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.sel
ect_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
# css
# excel
# html
# app
# csv
# ai
# 爬虫
# dns
# 数据清洗
# 状态码
# css选择器
# dns解析失败
# beautifulsoup
# pandas
# if
# for
# while
# select
# try
# 循环
# 数据结构
# append
# 选择器
# 下一页
# 分页
# 多个
# 遍历
# 这是
# 跳过
# 第一个
# 未找到
# 过大
# 转换为
相关文章:
购物网站制作公司有哪些,哪个购物网站比较好?
简历在线制作网站免费版,如何创建个人简历?
小型网站制作HTML,*游戏网站怎么搭建?
北京企业网站设计制作公司,北京铁路集团官方网站?
宁波免费建站如何选择可靠模板与平台?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
建站之星×万网:智能建站系统+自助建站平台一键生成
再谈Python中的字符串与字符编码(推荐)
如何规划企业建站流程的关键步骤?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
济南专业网站制作公司,济南信息工程学校怎么样?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
建站之星后台密码遗忘或太弱?如何重置与强化?
建站168自助建站系统:快速模板定制与SEO优化指南
制作网站外包平台,自动化接单网站有哪些?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
动图在线制作网站有哪些,滑动动图图集怎么做?
股票网站制作软件,网上股票怎么开户?
建站之星在线版空间:自助建站+智能模板一键生成方案
平台云上自助建站如何快速打造专业网站?
音乐网站服务器如何优化API响应速度?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何快速使用云服务器搭建个人网站?
建站之星24小时客服电话如何获取?
Android自定义listview布局实现上拉加载下拉刷新功能
如何用PHP快速搭建CMS系统?
如何快速搭建个人网站并优化SEO?
已有域名和空间,如何快速搭建网站?
网站设计制作企业有哪些,抖音官网主页怎么设置?
如何快速选择适合个人网站的云服务器配置?
如何通过西部建站助手安装IIS服务器?
建站主机无法访问?如何排查域名与服务器问题
盘锦网站制作公司,盘锦大洼有多少5G网站?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
建站之星伪静态规则如何设置?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
建站之星安装后如何自定义网站颜色与字体?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
建站之星代理费用多少?最新价格详情介绍
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
网站制作免费,什么网站能看正片电影?
如何在IIS中新建站点并配置端口与IP地址?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
内部网站制作流程,如何建立公司内部网站?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
视频网站制作教程,怎么样制作优酷网的小视频?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
高防服务器:AI智能防御DDoS攻击与数据安全保障
建站之星logo尺寸如何设置最合适?
*请认真填写需求信息,我们会在24小时内与您取得联系。