如何使用PyShark将pcap数据包中的经纬度数据导出为CSV格式
解决PyShark导出特定字段到CSV的问题
我明白你现在的需求——从pcap文件里提取像经纬度这类特定数据并导出成CSV,这是网络分析里很常见的场景,我来给你一步步讲怎么实现。
核心思路
PyShark本身没有直接导出CSV的内置功能,但我们可以结合Python标准库的csv模块,手动遍历每个数据包、提取目标字段,再写入CSV文件。关键是要准确找到字段在PyShark数据包对象里的访问路径,同时处理可能的字段缺失情况。
完整代码示例
下面是针对你的需求编写的代码,我会提取源IP、目的IP、目的GeoIP纬度、目的GeoIP经度这几个核心字段,你可以根据自己的需求灵活调整:
import pyshark import csv # 定义要提取的字段(作为CSV表头) target_fields = [ "source_ip", "destination_ip", "dest_geoip_latitude", "dest_geoip_longitude" ] # 打开CSV文件准备写入 with open("traces_geoip.csv", "w", newline="", encoding="utf-8") as csv_file: writer = csv.DictWriter(csv_file, fieldnames=target_fields) writer.writeheader() # 写入表头行 # 读取本地pcap文件 cap = pyshark.FileCapture("./final_traces.pcap") for packet in cap: packet_data = {} try: # 提取IP层基础字段 ip_layer = packet.ip packet_data["source_ip"] = ip_layer.src packet_data["destination_ip"] = ip_layer.dst # 提取GeoIP经纬度(字段名需与PyShark输出对应) packet_data["dest_geoip_latitude"] = ip_layer.destination_geoip_latitude packet_data["dest_geoip_longitude"] = ip_layer.destination_geoip_longitude except AttributeError: # 跳过无IP层或字段缺失的数据包,避免程序崩溃 print(f"跳过异常数据包(无IP层/字段缺失): 编号 {packet.number}") continue # 将当前数据包数据写入CSV writer.writerow(packet_data) cap.close()
关键细节说明
- 字段路径确认:如果不确定字段的准确访问名,可以用
print(dir(packet.ip))打印IP层的所有属性,或者直接打印packet.ip查看字段名,确保和PyShark输出的字段对应(比如你示例里的Destination GeoIP Latitude对应destination_geoip_latitude)。 - 异常处理:不是所有数据包都包含IP层(比如ARP包),部分IP包也可能没有GeoIP数据,所以用
try-except捕获AttributeError,保证程序能持续运行。 - CSV写入优化:用
csv.DictWriter可以直接按表头键值对写入,不需要手动维护字段顺序,更易扩展。
扩展调整
如果你需要提取其他字段(比如TCP端口、数据包长度),只需要:
- 在
target_fields列表中添加对应的表头 - 在
try块中提取对应字段,比如:if hasattr(packet, "tcp"): packet_data["tcp_dest_port"] = packet.tcp.dstport
运行代码后,你就能得到一个包含目标字段的结构化CSV文件了。
内容的提问来源于stack exchange,提问作者Coding_Karma
相关产品推荐
相关产品推荐

