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

Python网页爬虫仅导出数组前240条至CSV的问题求助

问题排查与解决方法

核心问题分析

你的代码存在两个关键问题,导致CSV仅导出240条数据:

1. 递归分页逻辑错误

原代码中,处理每页的每个条目时都执行page_number +=1,这会导致页码快速递增:比如一页有10条数据,处理完这页后页码会直接从0跳到10,很快就会触发page_number <=234的终止条件,实际只爬取了20多页(234/10≈23),对应240条左右数据。

同时,原代码每次添加一个条目就遍历整个Name_arr打印,导致控制台输出大量重复内容,让你误以为爬取了所有数千条数据,实际Name_arr里只有240条有效数据。

2. CSV写入缩进错误

写入CSV数据的for循环不在with open(...)代码块内,当with块执行完毕后,文件已经自动关闭,后续的writerow操作无法生效(如果你的实际代码缩进确实如此,可能会直接报错;若你贴代码时格式有误,也可能导致部分写入)。


解决步骤与修正代码

步骤1:修正递归分页逻辑

将page_number +=1移到处理完整个页面所有条目的循环外面,确保处理完一页后才递增页码;同时修改打印逻辑,只打印当前新增的条目,避免重复输出。

修正后的爬虫函数:

def webscraper(web_page, page_number):
    # 固定基础URL,避免每次递归重置
    base_url = 'myUrl'
    next_page = base_url + str(page_number)
    
    response = requests.get(next_page)
    soup = BeautifulSoup(response.content, "html.parser")
    
    soup_name = soup.findAll("h5", {"class": "nameOverflow"})
    
    # 遍历当前页面的所有条目
    for name_tag in soup_name:
        name = name_tag.text.strip()
        Name_arr.append(name)
        # 打印当前新增的条目,用数组长度作为总计数
        print(f"{len(Name_arr)} == {name}")
    
    # 处理完整个页面后,页码加1
    page_number += 1
    
    # 递归爬取下一页
    if page_number <= 234:
        webscraper(base_url, page_number)

步骤2:修正CSV写入缩进

将写入数据的for循环放到with open(...)代码块内,确保文件在打开状态下完成所有写入操作:

# 生成CSV文件
with open('plumbers.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldNames = ['number', 'name']
    thewriter = csv.DictWriter(csvfile, fieldnames=fieldNames)
    thewriter.writeheader()
    
    item_number = 1
    for plumber in Name_arr:
        thewriter.writerow({'number': item_number, 'name': plumber})
        item_number += 1

额外优化建议

  • 避免使用全局变量:可以将数组作为函数参数传递或返回,减少全局变量带来的副作用。
  • 添加异常处理:对requests.get添加异常捕获,避免网络请求失败导致程序崩溃。
  • 控制请求频率:添加time.sleep(1)避免频繁请求被目标网站封禁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:45:11