UWP + WebView + XPath でスクレイピングする
WebView の InvokeScriptAsync() を利用してスクレイピングしてみた。
public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); Loaded += MainPage_Loaded; } private void MainPage_Loaded(object sender, RoutedEventArgs e) { var browser = new WebView(); var url = "https://google.co.jp/"; var xpath = "//h1"; var result_type = "XPathResult.FIRST_ORDERED_NODE_TYPE"; var function = $"document.evaluate(" + "'{xpath}', 'document', null, {result_type}, null" + ").singleNodeValue.innerHTML;"; browser.NavigationCompleted += async (s, args) => { if (!args.IsSuccess) throw new Exception(); var html = await browser.InvokeScriptAsync( "eval", new string[] { function, } ); System.Diagnostics.Debug.WriteLine(html); }; browser.Navigate(new Uri(url)); } }
一応うまくいっているみたい。
しかし、Windows ストアなんかでスクレイピングをやろうとすると、アプリの切り替えダイアログが出てしまう(プロトコルハンドラーとか言うのか? これ)。
あと、AngularJS みたいなサイトでは使えないかもしれない(やり方が悪いだけかもしれない)。また、WebView は UI スレッドで動作するらしいので、バックグラウンドタスクで利用することもできない。あんまりスジのいい方法ではなさそうだ、というのが今回の結論かも。