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

浙公网安备 33010602011771号