canard29 Ответов: 1

Webscraping веб-страница в C#


Привет,

Я хочу интегрировать функцию этой страницы http://dniperu.online/buscador/buscardni_11ab.php в приложении на языке C#.

При открытии страницы пользователь должен ввести 3 параметра:
- Первая фамилия: Вискарра
- Вторая фамилия: Корнехо
- Имя(ы):Мартин Альберто

Страница возвращает идентификатор человека.
Чтобы проверить этот идентификатор, мы можем воспользоваться этой ссылкой:
https://api.reniec.cloud/dni/04412417

Мой код не работает, у вас есть какие-нибудь предложения ? Я думаю, может быть, это проблема с печеньем.

Что я уже пробовал:

var request = (HttpWebRequest)WebRequest.Create("http://dniperu.online/buscador/buscardni_11ab.php?ref=busqueda");
var postData = "APE_PAT=Vizcarra&APE_MAT=Cornejo&NOMBRES=Mart%C3%ADn+Alberto";
var data = Encoding.ASCII.GetBytes(postData);
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

1 Ответов

Рейтинг:
5

F-ES Sitecore

Лучший способ диагностировать эти проблемы-использовать сетевой раздел инструментов разработчика в браузере, чтобы изучить запрос, когда вы делаете это через браузер, и попытаться как можно лучше имитировать его в своем коде. В вашем случае есть две конкретные проблемы, одна из которых заключается в том, что код на их стороне имеет некоторые основные меры, чтобы остановить людей, обращающихся к нему напрямую, поэтому он, очевидно, проверяет заголовок реферера, чтобы убедиться, что он пришел из предполагаемого встроенного iframe. Чтобы обойти это, просто обманите реферера.

request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.Referer = "http://dniperu.online/buscador/buscardni_11ab.php";


Второй вопрос заключается в том, что по какой-то причине (опять же, может быть, форма защиты?) ответ, который он возвращает, на самом деле равен 500, так что это пользовательская страница ошибок, которую вы видите в iframe, а не обычный документ возврата. Таким образом, чтобы разобрать его, вам нужно будет обновить свой код, чтобы прочитать ответ на ошибку, а не возвращенный html;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

HttpWebResponse response = null;
string responseString;

try
{
    response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
    // the 500 response html can now be accessed via ex.Response
    responseString = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
}


canard29

Спасибо за ваш ответ. теперь это работает. Мне просто нужно прочитать HTML, чтобы построить объект