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)); } }

一応うまくいっているみたい。

f:id:daruyanagi:20170318025944p:plain

しかし、Windows ストアなんかでスクレイピングをやろうとすると、アプリの切り替えダイアログが出てしまう(プロトコルハンドラーとか言うのか? これ)。

f:id:daruyanagi:20170318030427p:plain

あと、AngularJS みたいなサイトでは使えないかもしれない(やり方が悪いだけかもしれない)。また、WebView は UI スレッドで動作するらしいので、バックグラウンドタスクで利用することもできない。あんまりスジのいい方法ではなさそうだ、というのが今回の結論かも。