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

BeautifulSoup爬取greatlakeships船舶数据为空及CSV保存问题求助

问题排查与修复

你代码的问题主要出在3个地方:

  • 列表页请求未携带headers参数,容易被网站反爬拦截,即使能获取到链接,后续详情页访问也可能被限制
  • 详情页的元素定位错误,你查找的class="DetailsSub"的div在目标页面不存在,船舶属性实际存放在<dl>标签下,需要修正定位规则
  • 没有容错逻辑,部分船舶存在字段缺失的情况,直接按索引取<dd>标签会触发索引溢出错误,导致程序中断

修复后的完整代码如下,已经内置CSV保存逻辑:

import requests
from bs4 import BeautifulSoup
import csv

baseurl = 'https://greatlakeships.org/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

productlinks = []
# 可自行调整翻页范围
for x in range(1, 2):
    # 列表页请求添加headers
    response = requests.get(f'https://greatlakeships.org/results?bl=and&st=kw&q2=text%3A%28%2A%3A%2A%29&rows=20&sort=titleSort%20asc&p={x}', headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')
    productlist = soup.find_all('ul', class_='single')
    for item in productlist:
        for link in item.find_all('a', href=True):
            productlinks.append(baseurl + link['href'])
print(f"获取到详情页链接数量:{len(productlinks)}")

tabledata = []
# 定义字段顺序,后续CSV保存用
field_names = [
    'Also known as', 'Year of Build', 'Official Number', 'Built at',
    'Vessel Type', 'Additional vessel types', 'Hull Materials',
    'Builder Name', 'Original Owner and Location', 'Length',
    'Beam', 'Depth', 'Tonnage (gross)', 'Tonnage (net)', 'Contact'
]

for data in productlinks:
    response = requests.get(data, headers=headers)
    soup = BeautifulSoup(response.content, 'html.parser')
    # 修正元素定位:查找所有dl下的dd标签
    dds = soup.select('dl.data dd')
    # 容错处理:如果dd数量不足15个,补空值
    values = [dd.get_text(strip=True) if i < len(dds) else '' for i, dd in enumerate(dds[:15])]
    tr_data = dict(zip(field_names, values))
    tabledata.append(tr_data)

# 保存为CSV文件
with open('船舶数据.csv', 'w', encoding='utf-8-sig', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=field_names)
    writer.writeheader()
    writer.writerows(tabledata)

print(f"共爬取到{len(tabledata)}条数据,已保存到船舶数据.csv")
CSV保存说明

上面代码已经实现了CSV保存功能,用utf-8-sig编码可以避免打开CSV时出现中文乱码,如果你需要调整保存路径或者字段顺序,直接修改field_names和open函数的路径参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:15:04