だるろぐ

明日できることは、今日しない。

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 スレッドで動作するらしいので、バックグラウンドタスクで利用することもできない。あんまりスジのいい方法ではなさそうだ、というのが今回の結論かも。