编写有关Web爬网程序的TCP流量的pcap文件

时间:2019-11-01 11:35:44

标签: python-3.x web-crawler scapy pcap

url请求和sniff(count = x)不能一起使用。 sniff(count)正在等待x数据包的嗅探,尽管我必须将这行放在url-request之前它阻止程序,但url-request从不开始,也从不嗅探任何数据包。

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

现在最简单的方法是编写2个脚本并从2个不同的Windows启动它们,但我想用一个脚本完成全部工作:Web爬网,嗅探数据包并将它们放入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文件中?

2 个答案:

答案 0 :(得分:2)

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

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

这将执行功能prot.run并将结果传递到target的{​​{1}}参数。应该是:

Thread

这会将函数本身传递到Main.thr = threading.Thread(target=prot.run)

答案 1 :(得分:2)

另一个答案很好用。 仅供参考,Scapy 2.4.3也具有本机操作方式:

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