Python爬虫用BeautifulSoup提取文本导出CSV仅含表头无数据求助
问题定位与解决方案
核心问题原因
- 请求标识不规范导致结果不一致:requests默认使用
python-requests/版本号作为客户端标识,极易被网站的反爬规则识别。运行测试代码阶段,网站返回了完整的产品列表;运行导出代码阶段,请求被拦截,返回的空页面仅保留了id=archive-product的外层容器,不存在任何带class=product-h2的产品子元素,导致循环遍历不到内容,存储产品的列表为空,最终生成的CSV仅包含表头。 - 测试代码存在逻辑隐患:测试代码中将
print(row.get_text())的结果赋值给字典键,而print函数本身没有有效业务返回值,只会返回None。这种写法仅能在控制台打印内容,实际存入字典的值是空值,属于爬虫开发新手的典型混淆点。 - 文本提取未做基础清洗:即使成功获取到元素内容,
row.get_text()会直接保留元素内的大量连续换行、前后多余空格,不做处理的话导出的CSV单元格会充满无效空白,可读性极差。
修正后可直接运行的代码
import requests from bs4 import BeautifulSoup import csv # 模拟正常浏览器的请求头,规避基础反爬规则 REQUEST_HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } TARGET_URL = "https://intanseafood.com/demersal-fish" # 发送带请求头的GET请求,设置超时避免程序无响应 response = requests.get(TARGET_URL, headers=REQUEST_HEADERS, timeout=15) # 主动校验请求状态,遇到4xx/5xx错误直接抛出异常 response.raise_for_status() soup = BeautifulSoup(response.content, "html5lib") product_list = [] # 定位产品列表外层容器 product_container = soup.find("div", attrs={"id": "archive-product"}) # 容器定位失败时直接退出,避免后续调用触发空对象报错 if not product_container: print("未定位到产品列表容器,请检查页面结构或反爬规则") exit() # 遍历所有产品条目 for product_item in product_container.findAll("div", attrs={"class": "product-h2"}): # 清理文本:去除前后空白,替换连续换行、多空格为有效内容 clean_name = product_item.get_text(strip=True).replace("\n", "").replace(" ", "") product_list.append({"product": clean_name}) # 导出CSV,指定UTF-8编码避免打开乱码 output_file = "demersal.csv" with open(output_file, "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["product"]) writer.writeheader() for item in product_list: writer.writerow(item) print(f"导出完成,共写入{len(product_list)}条产品数据")
实操注意事项
- 不要对目标网站发起连续高频请求,否则会持续触发反爬拦截,可以在每次请求后增加1-2秒的随机延时,降低请求频率。
- 网站前端结构调整时,需要重新检查元素的class、id属性,避免因页面改版导致元素定位失效。
- 导出CSV时将编码改为
utf-8-sig,可以更好兼容Windows系统下直接用Excel打开时的特殊字符、中文乱码问题。
内容的提问来源于stack exchange,提问作者Amri
相关产品推荐
相关产品推荐

