C#如何捕获浏览器原始数据请求(DevTools下的Network功能)

前言

最近在逛偶尔逛的视频网站时,发现无法直接下载视频了。以前网页播放器是能看到原始视频地址的,现在更新为流播放了。

虽然可以通过浏览器的开发者工具下的网络工具,找到对应的m3u8地址,再通过ffmpeg进行下载(https://www.cnblogs.com/zhaotianff/p/13824553.html)

但是这种方法需要人工操作,万一我想自动下载呢?

 

办法总比困难多。

在前面的文章中,我介绍过如何使用CEFSharp来抓取动态网页数据(https://www.cnblogs.com/zhaotianff/p/9556270.html)

CEFSharp作为基于Google Chromium项目的开源Web browser控件,它具备的功能远不止于此。

我们可以通过处理CEFSharp的请求来实现我们想要的功能

 

说明:Puppeteer-Sharp也可以实现类似的功能(https://www.cnblogs.com/zhaotianff/p/13528507.html

 

这里我们以捕获网页中的图片为例

实现步骤如下:

1、创建一个WPF工程,引用CEFSharp包

这里我们左边放置ChromiumWebBrowser控件,右边放置一个列表控件,当捕获到图片时,在列表中进行显示。

MainWindow.xaml

 1 <Window x:Class="CSharpProcessBrowserResponse.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6         xmlns:local="clr-namespace:CSharpProcessBrowserResponse"
 7         xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
 8         mc:Ignorable="d"
 9         Title="MainWindow" Height="550" Width="920">
10     <Grid>
11         <Grid.ColumnDefinitions>
12             <ColumnDefinition Width="4*"/>
13             <ColumnDefinition Width="*"/>
14         </Grid.ColumnDefinitions>
15 
16         <Grid>
17             <cef:ChromiumWebBrowser x:Name="cef"></cef:ChromiumWebBrowser>
18         </Grid>
19 
20         <ListBox Name="list">
21             <ListBox.ItemTemplate>
22                 <DataTemplate>
23                     <Image Height="100" Stretch="Uniform" Margin="10" Source="{Binding}"></Image>
24                 </DataTemplate>
25             </ListBox.ItemTemplate>
26         </ListBox>
27     </Grid>
28 </Window>

 

MainWindow.xaml.cs

 1  /// <summary>
 2  /// MainWindow.xaml 的交互逻辑
 3  /// </summary>
 4  public partial class MainWindow : Window
 5  {
 6      private ObservableCollection<string> imageUrlList = new ObservableCollection<string>();
 7 
 8      public MainWindow()
 9      {
10          InitializeComponent();
11 
12          this.list.ItemsSource = imageUrlList;
13      }
14 
15      public void AddImageUrl(string url)
16      {
17          this.imageUrlList.Add(url);            
18      }
19  }

 

2、自定义图片请求处理类

 

 1 public class ImageCapturingResourceRequestHandler : ResourceRequestHandler
 2 {
 3     protected override bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser,
 4         IFrame frame, IRequest request, IResponse response)
 5     {
 6         var mimeType = response.MimeType;
 7 
 8         if (mimeType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
 9         {
10             Console.WriteLine($"请求地址 : {request.Url} - MIME类型: {mimeType}");
11 
12             Application.Current.Dispatcher.Invoke(() => {
13                 //添加到显示列表中
14                 (Application.Current.MainWindow as MainWindow).AddImageUrl(request.Url);
15             });          
17         }
18 
19         return false;
20     }
21 }

 

 

3、自定义请求类

1     public class CustomRequestHandler : CefSharp.Handler.RequestHandler
2     {
3         protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
4         {
5             return new ImageCapturingResourceRequestHandler();
6         }
7     }

 

4、使用自定义请求类

在初始化时,使用自定义请求类。

我这里方便演示,直接放到Loaded事件中,并打开指定的Url

1         private void Window_Loaded(object sender, RoutedEventArgs e)
2         {
3             cef.RequestHandler = new CustomRequestHandler();
4             cef.Address = "https://www.baidu.com";
5         }

 

运行效果如下:

 

说明: 其它相关请求/响应参数可以通过IRequest/IResponse去取,这里不做演示。

 

示例代码

下载 

 

更多爬虫开发知识可以访问我的github

https://github.com/zhaotianff/CSharpCrawler

 

参考资料:

https://github.com/cefsharp/CefSharp/wiki/General-Usage

 

posted @ 2025-05-08 14:26  zhaotianff  阅读(67)  评论(0)    收藏  举报