收集流量数据包即是在浏览器输入一个URL让浏览器去访问,同时打开捕包软件,访问完毕之后保存捕获的流量数据包即可;自动收集流量包即是让着一过程交给python代码来做,我们需要做的就是提供访问的URL和访问结束后去指定的地方查看数据就好了。
流量收集思路:
- 1、用代码控制,模拟浏览器访问网站;
- 2、在浏览器访问网站的时候同时打开捕包软件(一个子线程)负责收集流量数据;
- 3、访问完成之后关闭浏览器,保存流量数据。
import time
import threading
from scapy.sendrecv import sniff
from scapy.utils import wrpcap
from selenium import webdriver
class MyThread(threading.Thread):
def __init__(self, ids, url, timeout, browser):
threading.Thread.__init__(self)
self.ids = ids # 线程ID,控制线程职责(捕获数据、自动化访问)
self.url = url # 需要访问的URL
self.timeout = timeout # 访问完成大概需要的时间
self.browser = browser # 浏览器
print(self.name)
def run(self):
if self.ids:
# 控制浏览器访问
automated_access(self.url, self.browser, self.timeout)
else:
# 收集数据包
collect_pcap(self.timeout, self.url, self.browser)
def collect_pcap(timeout, url, browser):
"""
收集数据包
:param timeout: 访问时间
:param url: 需要访问的URL
:param browser: 浏览器
:return:
"""
data = sniff(timeout=timeout) # 可以加filter过滤,可以根据IP、端口、协议等规则过滤,具体过滤规则可自行百度
file_name = url.replace(':', '').replace('.', '').replace('//', '') # 保存的文件名
wrpcap("%s-%s.pcap" % (browser, file_name), data)
def new_window(driver, url):
url_handle = driver.current_window_handle # 获取当前窗口句柄
# 如果捕包同时需要两个网站及以上的流量可通过JS新开一个窗口访问另外一个网站
js = 'window.open("%s");' % url
driver.execute_script(js)
handles = driver.window_handles # 获取浏览器打开窗口的所有句柄
print(handles)
# 句柄默认在第最新打开URL的窗口,如需要关闭其他窗口,可通过句柄切换到对应窗口进行关闭
driver.switch_to.window(handles[1])
driver.close() # 关闭对应窗口
def automated_access(url, browser, timeout):
"""
控制自动化访问
:param url: 需要访问的URL
:param browser: 浏览器这里只有Chrome跟Firefox,需要其他浏览器的可自行添加
:param timeout: 访问时间
:return:
"""
if browser == 'Chrome':
options = webdriver.ChromeOptions()
# options.add_argument('--headless') # 添加无头浏览器访问(主要是针对Linux下,或者docker自动化访问)
# options.add_argument('--no-sandbox') # 添加无头浏览器访问(主要是针对Linux下,或者docker自动化访问)
driver = webdriver.Chrome(options=options)
try:
driver.get(url) # 访问URL
new_window(driver, "http://www.csdn.net")
except Exception as e:
print(e.args)
time.sleep(timeout) # 线程休眠,保证浏览器充分访问完之后再关闭浏览器
driver.quit() # 退出浏览器
else:
options = webdriver.FirefoxOptions()
# options.add_argument('-headless') # 添加无头浏览器访问(主要是针对Linux下,或者docker自动化访问)
driver = webdriver.Firefox(options=options)
try:
driver.get(url)
new_window(driver, "http://www.csdn.net")
except Exception as e:
print(e.args)
time.sleep(timeout)
driver.quit()
print('finished...')
if __name__ == '__main__':
url_list = ["http://www.baidu.com", "http://www.qq.com"] # url列表
browser = ['Chrome', 'Firefox'] # 浏览器列表
timeout = 45 # 浏览器访问网站的时间
for i in range(100): # 每个浏览器访问每个URL的次数
for url in url_list:
for bro in browser:
thread1 = MyThread(0, url, timeout, bro)
thread1.start() # 启动子线程
thread2 = MyThread(1, url, timeout, bro)
thread2.start()
thread1.join() # 父线程等待子线程
thread2.join()
print("Exit thread%s" % i)
print("Exit the main thread ")