Войдите на веб-сайт Scraping Testing Ground и перейдите по ссылке Scrap html - PullRequest
0 голосов
/ 22 марта 2019

Я создаю веб-скребок, и мне нужно удалить html с веб-сайта, который требует входа в систему.

Я перепробовал большинство из стековых потоков, но не нашел того, кого ищу. Я не знаю, как получить результат HTML.

var baseAddress = new Uri("http://testing-ground.scraping.pro/login");
            var cookieContainer = new CookieContainer();
            using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
            using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
            {
                //usually i make a standard request without authentication, eg: to the home page.
                //by doing this request you store some initial cookie values, that might be used in the subsequent login request and checked by the server
                var homePageResult = client.GetAsync("/login");
                homePageResult.Result.EnsureSuccessStatusCode();

                var content = new FormUrlEncodedContent(new[]
                {
                    //the name of the form values must be the name of <input /> tags of the login form, in this case the tag is <input type="text" name="username">
                    new KeyValuePair<string, string>("usr", "admin"),
                    new KeyValuePair<string, string>("pwd", "12345"),
                });               
                var loginResult = client.PostAsync("/login", content).Result;
                loginResult.EnsureSuccessStatusCode();
                Console.WriteLine(loginResult);

Я ожидаю, что loginResult будет успешным, только если

usr is admin

и

pwd составляет 12345

но независимо от того, что это положительно. Кроме того, моя главная цель - удалить полученный HTML-код, поэтому в этом случае следует удалить HTML-код, который не имеет формы входа в систему, но вместо этого приветствует текст.

1 Ответ

0 голосов
/ 22 марта 2019

Хорошо, я понял! Это рабочий код

    public static async Task Login()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://testing-ground.scraping.pro/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));

                var username = "admin";
                var password = "12345";
                var formContent = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("usr", username),
                    new KeyValuePair<string, string>("pwd", password),
                });

                HttpResponseMessage responseMessage = await client.PostAsync("/login?mode=login", formContent);

                var response = await responseMessage.Content.ReadAsStringAsync();
                Console.WriteLine(response);
            }
        }

Я понял, что requestURL должен быть /login?mode=login из /login Я также изменил DefaultRequestHeaders на application/x-www-form-urlencoded после проверки в fiddler заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...