Python爬虫爬取数据无法写入CSV的问题排查与解决求助
谷歌爬取数据无法正确写入CSV的问题分析与解决
我来帮你拆解这个问题:
问题原因
你代码最后用csv.writer的writerows()方法写入data列表,但data中的元素是字典对象。csv.writer默认只能处理序列(比如列表、元组),当你传入字典时,它会迭代字典的键(也就是'rank'、'title'、'description'),所以最终CSV里只出现了这些键名,完全没写入实际的爬取数据。
另外,你原本也没有主动写入表头的逻辑,反而因为字典的迭代特性,把键名当成了内容行输出,这就导致了CSV里只有这三个字符串的问题。
解决方案
这里有两种可靠的解决方式,推荐第一种,因为它更适配你当前的字典格式数据:
方法1:使用csv.DictWriter(推荐)
csv模块提供了DictWriter类,专门用来处理字典格式的数据集,能自动匹配键和列的对应关系。修改你代码末尾的CSV写入部分:
if __name__ == '__main__': keywords = ['python'] data = [] for keyword in keywords: try: results = scrape_google(keyword,2, "en") for result in results: data.append(result) except Exception as e: print(e) finally: time.sleep(1) print(data) # 新增判断:确保有数据再写入 if data: # 定义CSV表头,和字典的键完全对应 fieldnames = ['rank', 'title', 'description'] # 使用with语句自动管理文件,newline=''避免Windows下空行问题 with open('python_scrape.csv', 'w', newline='') as csvFile: writer = csv.DictWriter(csvFile, fieldnames=fieldnames) writer.writeheader() # 写入表头行 writer.writerows(data) # 批量写入所有字典数据 # 无需手动调用csvFile.close(),with会自动处理
方法2:将字典转换为列表后用csv.writer写入
如果你更习惯用基础的csv.writer,可以把每个字典转换成包含对应值的列表,注意顺序要和表头一致:
if __name__ == '__main__': keywords = ['python'] data = [] for keyword in keywords: try: results = scrape_google(keyword,2, "en") for result in results: # 把字典的值按表头顺序转换成列表 data.append([result['rank'], result['title'], result['description']]) except Exception as e: print(e) finally: time.sleep(1) print(data) with open('python_scrape.csv', 'w', newline='') as csvFile: writer = csv.writer(csvFile) # 先写入表头 writer.writerow(['rank', 'title', 'description']) # 写入所有数据行 writer.writerows(data)
额外提示
- 谷歌页面结构变化:你代码里用的选择器(比如
class='g'、class='r')可能已经失效,导致爬取不到数据。可以先打印results看看是否为空列表,如果是空的,需要用浏览器开发者工具查看当前谷歌搜索结果的HTML结构,更新BeautifulSoup的选择器。 - 资源管理:永远不要手动调用
csvFile.close(),with语句会自动帮你关闭文件,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Etienne Gozlan
相关产品推荐
相关产品推荐

