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
相关产品推荐
相关产品推荐

