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

Write pcap file about TCP traffic of a web-crawler

提问人:Uwe_98 提问时间:11/1/2019 最后编辑:Uwe_98 更新时间:11/1/2019 访问量:276

问:

URL 请求和 sniff(count=x) 不能协同工作。sniff(count) 正在等待 x 个数据包进行嗅探,尽管我必须将该行放在 url-request 之前,但它会阻止程序,但 url 请求永远不会启动,它永远不会嗅探任何数据包。

当我在 ubuntu 命令行中打开 2 个 Windows 时,它起作用了。在第一个窗口中,我激活了 python 的交互模式并激活了嗅探器。完成后,我在第二个窗口中启动了网络爬虫,第一个窗口中的嗅探器正确接收了数据包并将其放在屏幕上/放入 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 数据包进入,什么不能这样做,因为只有在下一行中请求才完成。交换线路也不起作用。我认为解决问题的唯一方法是与无所事事一起工作,所以我也尝试过这个:

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 文件中?

python-3.x 网络爬虫 scapy pcap

评论


答:

2赞 Simon Notley 11/1/2019 #1

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

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

这将执行该函数并将结果传递给 的参数。它应该是:prot.runtargetThread

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

这会将函数本身传递给Thread

评论

0赞 Uwe_98 11/1/2019
我刚刚创建了 1 个额外的线程。run() 是 Protocoller 类的方法,也是对象 prot 的方法。第一部分的类称为 spider(),其方法是 parse()。
2赞 Cukic0d 11/1/2019 #2

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

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

评论

0赞 Uwe_98 11/2/2019
..我稍后会尝试一下。