Веб-очистка сайтов Java с помощью HtmlAgilityPack - PullRequest
0 голосов
/ 31 января 2019

Позвольте мне начать с того, что я не профессионал в изучении веб-страниц.Я могу сделать основы на большинстве платформ, но это все.

Я пытаюсь создать основу для веб-приложения, которое может помочь пользователям улучшить изучение языка путем создания дополнительных данных, метрик, а также созданияновые инструменты для самоконтроля.Веб-сайт Duolingo не предлагает никаких API, поэтому моя следующая мысль на данный момент это просто очистить https://www.duome.eu/. Я написал небольшой скребок, но не понял, что сайт был java.В следующем примере я хочу собрать все слова из вкладки Words, которые содержат якоря:

using System;
using HtmlAgilityPack;
using System.Net.Http;
using System.Text.RegularExpressions;

namespace DuolingoUpdate
{
    class Program
    {
        static void Main(string[] args)
        {
            string userName = "Podus";
            UpdateDuolingoUser(userName);
            Console.ReadLine();
        }

        private static async void UpdateDuolingoUser(string userName)
        {
            string url = "https://www.duome.eu/" + userName + "/progress/";

            // Create the http client connection
            HttpClient httpClient = new HttpClient();
            var html = await httpClient.GetStringAsync(url);

            // Store the html client data in an object
            HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(html);

            //var words = htmlDocument.DocumentNode.Descendants("div")
            //    .Where(node => node.GetAttributeValue("id", "")
            //    .Equals("words")).ToList();

            //var wordList = words[0].Descendants("a")
            //    .Where(node => node.GetAttributeValue("class", "")
            //    .Contains("wA")).ToList();

            Console.WriteLine(html);
        }
    }
}

html-объект приведенного выше кода содержит:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="google" value="notranslate">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Duolingo · Podus @ duome.eu</title>
<link rel="stylesheet" href="/style.css?1548418871" />
<link href="/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<script src="//code.jquery.com/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        if("".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            //localStorage.tz = visitortimezone;
            //timezone = Date.parse(localStorage.tz);
            //timezone = localStorage.tz;
            //console.log(timezone);
            $.ajax({
                type: "GET",
                url: "/tz.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

</head>
<body>
<noscript>Click <a href="https://duome.eu//Podus/progress/">here</a> to adjsut XP charts to your local timezone. </noscript>
<!-- Yandex.Metrika counter --> <script type="text/javascript" > (function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter47765476 = new Ya.Metrika({ id:47765476, clickmap:true, trackLinks:true, accurateTrackBounce:true }); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = "https://mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks"); </script> <noscript><div><img src="https://mc.yandex.ru/watch/47765476" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter -->
</body>
</html>

Но если вы перейдете по фактическому URL https://www.duome.eu/Podus/progress/,, на сайте будет много скриптов.Итак, при проверке первая проблема заключается в том, что я не получаю HTML, который вижу в браузере.Вторая проблема заключается в том, что если вы просматриваете источник, он не похож на то, что находится в inspect, и я не вижу ничего в источнике, которое заставило бы меня изолировать данные от div id="words".

, учитывая мою тусклостьзнание веб-страниц, созданных на Java, как мне это сделать, или это вообще возможно?

1 Ответ

0 голосов
/ 31 января 2019

Вы можете получить доступ к данным профиля dualingo в формате JSON через https://www.duolingo.com/users/<username>

например.https://www.duolingo.com/users/Podus

Это должно быть намного проще, чем пытаться почистить страницу профиля duome вручную.

...