编写有关网络爬虫 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
并将结果传递给Thread
的target
参数。应该是:
Main.thr = threading.Thread(target=prot.run)
这会将函数本身传递给 Thread
另一个答案很有效。
仅供参考,Scapy 2.4.3 也有这样做的原生方式:
https://scapy.readthedocs.io/en/latest/usage.html#asynchronous-sniffing
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
并将结果传递给Thread
的target
参数。应该是:
Main.thr = threading.Thread(target=prot.run)
这会将函数本身传递给 Thread
另一个答案很有效。 仅供参考,Scapy 2.4.3 也有这样做的原生方式:
https://scapy.readthedocs.io/en/latest/usage.html#asynchronous-sniffing