编写有关网络爬虫 TCP 流量的 pcap 文件

Write pcap file about TCP traffic of a web-crawler

url request 和 sniff(count=x) 不能一起工作。 sniff(count) 正在等待 x 个数据包进行嗅探,虽然我必须在 url-request 之前放置一行,但它会阻止程序,url-request 永远不会启动,它也不会嗅探任何数据包.

当我在 ubuntu 命令行中打开 2 Windows 时,它起作用了。在第一个 window 我激活了 python 的交互模式并激活了嗅探器。这样做之后,我在第二个 window 中启动了网络爬虫 int,第一个 window 中的嗅探器正确接收了数据包并将其放在屏幕上/放入 pcap 文件中。

现在最简单的方法是编写 2 个脚本并从 2 个不同的 Windows 开始,但我想在一个脚本中完成所有工作:网络爬虫、嗅探数据包并将它们放入 pcap -文件

这是不起作用的代码:

class spider():
…
    def parse():
        a = sniff(filter="icmp and host 128.65.210.181", count=1)
        req = urllib.request.urlopen(self.next_url.replace(" ",""))
        a.nsummary()
        charset = req.info().get_content_charset()

现在第一行阻塞程序,等待 4 数据包进来,不能这样做,因为只有在下一行请求完成。换行也不起作用。我认为解决问题的唯一方法是使用parallessisms,所以我也试过这个:

class protocoller(): 
    ...
    def run(self):
         self.pkt = sniff(count=5) # and here it blocks
…
prot = protocoller()
Main.thr = threading.Thread(target=prot.run())
Main.thr.start()

我一直以为线程运行独立于主程序,但它阻塞了它,就好像它是主程序的一部分一样。有什么建议吗?

所以我需要的是一个解决方案,其中网络爬虫和基于 scapy 的 IP/TCP 协议程序 运行 彼此独立。

scapy 的 sr() 函数可以替代吗?

https://scapy.readthedocs.io/en/latest/usage.html

是否可以手动将请求放在数据包中,并将接收到的数据包放入pcap文件中?

您的示例没有显示其他线程中正在发生的事情,因此我假设您有第二个线程来执行请求等。如果一切正常,那么明显的错误就在这里:

Main.thr = threading.Thread(target=prot.run())

这会执行函数prot.run并将结果传递给Threadtarget参数。应该是:

Main.thr = threading.Thread(target=prot.run)

这会将函数本身传递给 Thread

另一个答案很有效。 仅供参考,Scapy 2.4.3 也有这样做的原生方式:

https://scapy.readthedocs.io/en/latest/usage.html#asynchronous-sniffing