获取chrome的network内容并选择下载其中的资源

现在存在问题:要将网站反馈回来的get信号的内容获取到并下载资源
eg:
在这里插入图片描述chrome+键F12可见的内容

解决方式与思路:
方法:

  1. 使用webDriver或者selenium模拟浏览器传输信号,再截取返回回来的信号(这里使用的就是这个方法)。
  2. 使用selenium与browsermob-proxy;browsermob-proxy可以获取http内容导出为HAR文件。

思路:
3. 用selenium的api获取其中里面的message
4. 其中存在将请求变成log的文件的api( LogEntries logs = driver.manage().logs().get(LogType.PERFORMANCE);
),该文件是个json文件,可以使用json来解析获取想要的信息以及其的链接
5. 使用URL获取文件流,下载文件

代码如下:

package test;
import java.io.*;
import java.net.URL;
import java.util.Iterator;
import java.util.logging.Level;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

/**
 * chromedriver
 * dev-tool
 */
public class ChromedriverNetwork {
    public static final String port = "1527";
    public static final String filePath = "C:\\Users\\28124\\Desktop\\测试自动化\\自动化项目\\driver\\chromedriver.exe";
    public static void main(String[] args) {

        String sessionId ;
        String url = "http://www.ting56.com/video/18743-0-3.html";
        //System.setProperty("webdriver.chrome.driver",filePath);
        ChromeDriver driver = null;
        try {
            ChromeOptions options = new ChromeOptions();
            DesiredCapabilities cap = new DesiredCapabilities();
            ChromeDriverService service = new ChromeDriverService.Builder().usingPort(Integer.valueOf(port))
                    .usingDriverExecutable(new File(filePath))
                    .build();
            options.addArguments("disable-infobars");
            cap.setCapability(ChromeOptions.CAPABILITY, options);
            //配置日志
            LoggingPreferences logPrefs = new LoggingPreferences();
            logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
            /**flash 扩展*/
            cap.setCapability("profile.managed_default_content_settings.images",1);
            cap.setCapability("profile.content_settings.plugin_whitelist.adobe-flash-player",1);
            cap.setCapability("profile.content_settings.exceptions.plugins.*,*.per_resource.adobe-flash-player",1);
            cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
            driver = new ChromeDriver(service, cap);
            //or driver.get(url)
            driver.navigate().to(url);
//            System.out.println("session id :" + driver.getSessionId());
            sessionId = driver.getSessionId().toString();
            LogEntries logs = driver.manage().logs().get(LogType.PERFORMANCE);
            for (Iterator<LogEntry> it = logs.iterator(); it.hasNext();) {
                LogEntry entry = it.next();
                try {
                    //System.out.println(entry.toString());
                    JSONObject json = new JSONObject(entry.getMessage());
//                    System.out.println(json.toString());
                    JSONObject message = json.getJSONObject("message");
                    String method = message.getString("method");
                    //如果是响应
                    if (method != null && "Network.responseReceived".equals(method)) {
                        JSONObject params = message.getJSONObject("params");
                        JSONObject response = params.getJSONObject("response");
                        String messageUrl = response.getString("url");
//                        System.out.println("-----------------------------");
                        if (params.toString().contains("https://od.qingting.fm/m4a/")) {
                            InputStream in=new URL(messageUrl).openConnection().getInputStream(); //创建连接、输入copy流
                            FileOutputStream f = new FileOutputStream("C:\\Users\\28124\\Desktop\\测试自动化\\自动化项目\\file2\\a.m4a");//创建文百件度输出流
                            byte [] bb=new byte[1024]; //接收缓存
                            int len;
                            while( (len=in.read(bb))>0){ //接收
                                f.write(bb, 0, len); //写入问文件
                            }
                            f.close();
                            in.close();
                        }
//                        System.err.println("url:" + url + " params: " + params.toString() + " response: " + response.toString());
                        //打印调用chromedriver 调chrome httpapi 结果
//                        System.out.println(getResponseBody(params.getString("requestId"),port,sessionId));
//                        System.out.println("-----------------------------");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if (driver != null)
            {
                driver.quit();
            }
        }
    }


    // 根据请求ID获取返回内容
    public static String getResponseBody(String requestId,String port,String sessionId) {
        try {
            // CHROME_DRIVER_PORT chromeDriver提供的端口
            String url = String.format("http://localhost:%s/session/%s/goog/cdp/execute",
                    port, sessionId);

            HttpPost httpPost = new HttpPost(url);
            JSONObject object = new JSONObject();
            JSONObject params = new JSONObject();
            params.put("requestId", requestId);
            //api https://chromedevtools.github.io/devtools-protocol/tot/Network
            object.put("cmd", "Network.getResponseBody");

            object.put("params", params);

            httpPost.setEntity(new StringEntity(object.toString()));

            RequestConfig requestConfig = RequestConfig
                    .custom()
                    .setSocketTimeout(60 * 1000)
                    .setConnectTimeout(60 * 1000).build();

            CloseableHttpClient httpClient = HttpClientBuilder.create()
                    .setDefaultRequestConfig(requestConfig).build();

            HttpResponse response = httpClient.execute(httpPost);
            return EntityUtils.toString(response.getEntity());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

总结:

  1. 如果使用思路2,可以参考链接
    https://blog.csdn.net/m0_37618247/article/details/85066272

参考链接:
https://blog.csdn.net/qq_36783371/article/details/100122599

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取Chrome浏览器Network下各个组件的详细信息,可以使用Python中的Selenium库来自动化控制Chrome浏览器,并结合Chrome DevTools Protocol来获取网络请求信息。 下面是一个简单的示例代码,演示如何获取网络请求的详细信息: ```python from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 设置Chrome选项,启用开发者模式 chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", "localhost:9222") # 启动Chrome浏览器 webdriver_service = Service('path/to/chromedriver') driver = webdriver.Chrome(service=webdriver_service, options=chrome_options) # 导航到目标页面 driver.get('https://www.example.com') # 等待页面加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.TAG_NAME, 'body'))) # 执行JavaScript命令以启用Network监听 driver.execute_script("Performance.enable()") driver.execute_script("Network.enable()") # 获取Network请求信息 response = driver.execute_script("return JSON.stringify(await Network.getResponseBody({requestId: '<request_id>'}))") # 解析请求信息 print(response) # 关闭浏览器 driver.quit() ``` 上述代码使用了Selenium库来控制Chrome浏览器,首先需要启动Chrome浏览器,并通过开发者模式连接到已启动的浏览器实例。然后导航到目标页面,等待页面加载完成后,执行JavaScript命令以启用Network监听。最后,使用`Network.getResponseBody`方法获取指定请求的响应信息,并进行解析处理。 请注意,上述代码中的`<request_id>`需要替换为您要获取详细信息的具体请求的请求ID。您可以使用其他Chrome DevTools Protocol提供的方法来获取请求ID,或根据您的需求进行进一步的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值