You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历含游艇链接的DataFrame,添加对应游艇数据行?

批量爬取游艇数据并整合到现有URL DataFrame

核心思路

把你已实现的单页爬取逻辑封装成可复用函数,遍历每个存储URL的DataFrame,对每行的游艇URL调用函数获取数据,将爬取到的游艇信息与原行的链接段、完整URL合并,最终汇总所有结果。

优化后的单页爬取函数

原代码可以简化并封装,同时处理异常情况:

import pandas as pd
import requests
import time
from bs4 import BeautifulSoup

# 预设列头
COLUMN_HEADERS = ['Name', 'Length', 'Guests', 'Crew', 'Builder', 
                  'Designer', 'Interior Designer', 'Year', 'Speed',
                  'Engines', 'Volume', 'IMO', 'Price', 
                  'Annual Running Cost', 'Owner', 'Captain']

def scrape_yacht_data(url):
    """爬取单个游艇页面的数据,返回包含游艇信息的字典"""
    try:
        # 添加延时,避免请求过于频繁
        time.sleep(1)
        r = requests.get(url, verify=False)
        r.raise_for_status()  # 检查请求是否成功
        soup = BeautifulSoup(r.text, 'html.parser')
        table = soup.find('div', id='main')
        
        data = []
        for tr in table.find_all('tr'):
            # 提取每个tr的第二个td(索引1)的文本
            td = tr.find_all('td')[1]
            item = td.text.strip().replace("\n", "")
            data.append(item)
        
        # 确保数据长度和列头匹配(防止页面结构变化)
        if len(data) == len(COLUMN_HEADERS):
            return dict(zip(COLUMN_HEADERS, data))
        else:
            print(f"URL {url} 数据长度不匹配,跳过")
            return None
    except Exception as e:
        print(f"爬取URL {url} 失败: {str(e)}")
        return None

批量处理URL DataFrames

假设你所有存储URL的DataFrames都放在一个列表url_dfs中(比如url_dfs = [df_a_c, df_d_f, ...]),执行以下代码批量爬取并合并:

# 存储最终结果
final_results = []

for url_df in url_dfs:
    # 遍历当前DataFrame的每一行
    for idx, row in url_df.iterrows():
        link_segment = row['游艇专属链接段']
        full_url = row['完整URL']
        
        # 爬取游艇数据
        yacht_data = scrape_yacht_data(full_url)
        
        if yacht_data:
            # 合并链接信息和游艇数据
            combined_data = {
                '游艇专属链接段': link_segment,
                '完整URL': full_url,
                **yacht_data
            }
            final_results.append(combined_data)

# 将结果转换为DataFrame
final_df = pd.DataFrame(final_results)
# 可以按需调整列顺序,确保链接列在前
column_order = ['游艇专属链接段', '完整URL'] + COLUMN_HEADERS
final_df = final_df[column_order]

# 保存结果到CSV
final_df.to_csv('所有游艇数据.csv', index=False, encoding='utf-8-sig')

关键说明

  • 异常处理:捕获请求失败、页面结构变化等异常,避免程序中断,同时打印错误信息便于排查。
  • 请求延时:添加time.sleep(1)降低请求频率,降低被网站封禁IP的风险。
  • 数据校验:检查爬取的数据长度是否与列头匹配,避免因页面结构变动导致的数据错乱。
  • 高效合并:使用字典合并的方式构建每行数据,比append更高效(append已被Pandas标记为过时)。

内容的提问来源于stack exchange,提问作者user4859346598

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:42:47