使用Python请求响应原始文件类对象(进程pcap文件而不保存到磁盘)

时间:2015-04-12 10:04:20

标签: python python-requests scapy dpkt

在Python(2.7.9)Requests library:

的帮助下,从url下载了pcap文件
import requests
response = requests.get('http://example.com/path/1.pcap',  stream=True)

根据文档response.raw是一个类似文件的对象,我的目标是处理下载的文件而不将其保存到磁盘。

我首先查看了ScapyPyshark库以进行.pcap文件解析,但它们的函数(rdpcapFileCapture)接受文件路径字符串作为参数。来自pcap.Reader库的dpkt接受文件对象。第一次尝试pcap=dpkt.pcap.Reader(resonse.raw)给出了错误:

AttributeError: 'HTTPResponse' object has no attribute 'name'

添加了名称属性:

setattr(response.raw,'name', 'test.pcap')

之后pcap=dpkt.pcap.Reader(resonse.raw)没有提出任何错误,但pcap.readpkts()失败

io.UsupportedOperation: seek

确实response.raw.seekable()会返回False

我尝试设置response.raw.decode_content = True,但这没有帮助。

是否有按照我正在尝试的方式处理对象的解决方案?获取可搜索的响应对象可能需要其他请求参数吗?

顺便说一句,如果将响应对象写入文件(shutil.copyfileobj(response.raw,file)),则dpkt之后成功处理该文件。

1 个答案:

答案 0 :(得分:1)

最近向dpkt添加了对StringIO对象的支持。所以,现在你可以从你的字符串创建一个StringIO对象,然后传递给pcap.Reader

从字符串创建StringIO对象:

from StringIO import StringIO
data = StringIO("aaaaa..aa")

然后你可以做

import dpkt
from StringIO import StringIO
import requests

response = requests.get('http://example.com/path/1.pcap',  stream=True)
data = StringIO(response.raw)
pcap = dpkt.pcap.Reader(data)
    for ts, buf in pcap:
        eth = dpkt.ethernet.Ethernet(buf)
        ...