如何遍历含游艇链接的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
相关产品推荐
相关产品推荐

