Python处理Twitter爬虫CSV数据:保留指定字段求助
解决Twitter CSV数据冗余:筛选指定字段的Python实现指导
嘿,自学一周就能搞定Twitter数据爬取,这进度相当可以啊!看了你写的代码思路,我明白你想保留指定字段、剔除冗余数据的需求,咱们一步步把代码调整得能用起来~
首先先纠正几个基础的语法和逻辑问题:
- 开头的导入语句要分开写:
import csv和import json(如果你的代码里没用到json可以直接删掉) - 你原来的循环里用
f.readlines()会把文件指针直接跳到末尾,后面的循环就读不到内容了,绝对不能这么用 - 判断逻辑搞反啦:你写的
if box contains 'created_at': continue是说遇到这个字段就跳过,但你实际是要保留它,应该反过来——只保留你列出的这些字段,其他全部排除
接下来分两种场景给你代码方案,先对应你的CSV格式来选:
场景1:你的CSV是标准表头+行列格式(第一行是字段名,后续每行是一条推文的对应值)
这种情况用Python内置的csv模块最方便,新手优先推荐生成新文件的方式(避免误改原数据,毕竟爬数据不容易):
方案1:生成清洗后的新CSV文件(推荐)
import csv # 把你要保留的字段列在这里,后续要改直接调整这个列表就行 wanted_fields = [ 'created_at', 'id', 'text', 'source', 'name', 'screen_name', 'location', 'url', 'description', 'translator_type', 'protected', 'verified', 'followers', 'friends', 'listed', 'favourites', 'statuses', 'time', 'lang', 'is_translator', 'default_profile', 'notification', 'geo', 'coordinates', 'place', 'contributors', 'quoted_status', 'retweeted_status' ] # 用with语句自动管理文件,不用手动close,更安全 with open('csvdata.csv', 'r', encoding='utf-8') as infile, open('cleaned_tweets.csv', 'w', newline='', encoding='utf-8') as outfile: # DictReader会把每行数据转成字典,直接通过字段名提取值 reader = csv.DictReader(infile) # DictWriter负责写入新文件,指定要保留的字段作为表头 writer = csv.DictWriter(outfile, fieldnames=wanted_fields) # 先写入表头行 writer.writeheader() # 遍历每条推文数据 for row in reader: # 只提取我们需要的字段,过滤掉冗余内容 cleaned_row = {field: row[field] for field in wanted_fields if field in row} # 写入新文件 writer.writerow(cleaned_row) print("数据清洗完成!新文件已保存为 cleaned_tweets.csv")
方案2:直接修改原CSV文件(谨慎使用!建议先备份原文件)
如果一定要直接修改原文件,得先把所有数据读到内存里,再覆盖写入,不然会导致数据丢失:
import csv wanted_fields = [ 'created_at', 'id', 'text', 'source', 'name', 'screen_name', 'location', 'url', 'description', 'translator_type', 'protected', 'verified', 'followers', 'friends', 'listed', 'favourites', 'statuses', 'time', 'lang', 'is_translator', 'default_profile', 'notification', 'geo', 'coordinates', 'place', 'contributors', 'quoted_status', 'retweeted_status' ] # 第一步:把所有清洗后的数据读到内存里 cleaned_data = [] with open('csvdata.csv', 'r', encoding='utf-8') as infile: reader = csv.DictReader(infile) # 先检查要保留的字段是否都在原表头里,避免报错 valid_fields = [field for field in wanted_fields if field in reader.fieldnames] for row in reader: cleaned_row = {field: row[field] for field in valid_fields} cleaned_data.append(cleaned_row) # 第二步:覆盖写入原文件 with open('csvdata.csv', 'w', newline='', encoding='utf-8') as outfile: writer = csv.DictWriter(outfile, fieldnames=valid_fields) writer.writeheader() # 批量写入所有清洗后的数据,效率更高 writer.writerows(cleaned_data) print("原文件已更新!只保留了你指定的字段")
场景2:你的CSV每行是一个完整的Twitter JSON对象(每条推文是JSON字符串存在一行里)
看你导入了json,猜测可能是这种情况——Twitter API返回的是JSON格式,你直接把每条JSON存成了CSV的一行。这种情况需要先把JSON转成字典,再提取嵌套字段:
import csv import json # 注意嵌套字段的写法,比如user里的name要写成'user.name' wanted_fields = [ 'created_at', 'id', 'text', 'source', 'user.name', 'user.screen_name', 'user.location', 'user.url', 'user.description', 'user.translator_type', 'user.protected', 'user.verified', 'user.followers_count', 'user.friends_count', 'user.listed_count', 'user.favourites_count', 'user.statuses_count', 'user.created_at', 'user.lang', 'user.is_translator', 'user.default_profile', 'notifications', 'geo', 'coordinates', 'place', 'contributors', 'quoted_status', 'retweeted_status' ] # 专门处理嵌套字段的小函数,比如从user字典里取出name def get_nested_value(data, field): keys = field.split('.') value = data for key in keys: try: value = value[key] except (KeyError, TypeError): # 如果字段不存在就返回空字符串 value = '' return value # 生成清洗后的新文件 with open('csvdata.csv', 'r', encoding='utf-8') as infile, open('cleaned_tweets.csv', 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) # 写入表头 writer.writerow(wanted_fields) for line in infile: try: # 把每行的JSON字符串转成Python字典 tweet = json.loads(line.strip()) # 提取每个需要的字段值 row_values = [get_nested_value(tweet, field) for field in wanted_fields] writer.writerow(row_values) except json.JSONDecodeError: # 跳过解析失败的行(比如空行或者格式错误的行) continue print("数据清洗完成!新文件已保存为 cleaned_tweets.csv")
最后给你几个新手友好的提示:
- 永远先备份原数据!尤其是要修改原文件的时候,别辛辛苦苦爬的数据搞丢了
- 如果运行代码报错,先看报错信息——比如
KeyError就是说你指定的字段在原数据里不存在,调整wanted_fields列表就行 - 用
with语句打开文件是好习惯,它会自动帮你关闭文件,避免资源泄漏
内容的提问来源于stack exchange,提问作者B. Crull
相关产品推荐
相关产品推荐

