python selenium自动化收集流量数据包(PACP)

        收集流量数据包即是在浏览器输入一个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 ")

 

你可能感兴趣的:(python selenium自动化收集流量数据包(PACP))