Есть сайт, с которого надо спарсить данные. Проблема заключается в том, что я в силу отсутствия опыта не могу правильно это сделать. В дебаггере браузера нашёл, какой примерно POST-запрос надо отправлять:
faculty=0&teacher=&group=%CA%B2-51%EC&sdate=03.02.2020&edate=07.02.2020&n=700
Судя по получаемому ответу, этот запрос принимается и обрабатывается сервером - даты и название группы, отправленные в запросе, подставляются в текстовые поля на получаемой странице(как и при ручном введении этих данных), но вот проблема в следующем - в C# проекте получаемая страница вместо необходимых данных содержит в своём коде сообщение об ошибке, а в Node.JS проекте всё работает как надо. Коды используемых методов:
C#:
public static async Task PostRequestAsync()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
WebRequest request = WebRequest.Create("http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi/srequest.cgi");
request.Method = "POST";
string data = "n=700&faculty=0&teacher=&group=КІ-51м&sdate=03.02.2020&edate=07.02.2020";
byte[] byteArray = System.Text.Encoding.GetEncoding("windows-1251").GetBytes(data);
request.ContentLength = byteArray.Length;
using(Stream dataStream = request.GetRequestStream())
{
await dataStream.WriteAsync(byteArray, 0, byteArray.Length);
}
WebResponse response = await request.GetResponseAsync();
using(Stream stream = response.GetResponseStream())
{
using(StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("windows-1251")))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}
}
response.Close();
Console.WriteLine("Запрос выполнен...");
}
Node.JS:
const iconv = require("iconv-lite");
var axios = require("axios");
axios
.post(
"http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi?n=700",
"faculty=0&teacher=&group=%CA%B2-51%EC&sdate=&edate=&n=700",
{
responseType: "arraybuffer",
responseEncoding: "binary",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
}
)
.then(function (response) {
let z = iconv
.encode(iconv.decode(response.data, "cp1251"), "utf8")
.toString();
console.log(z);
});
Работающий Node.JS код скинул случайный знакомый, я этот язык не знаю совсем. Как мне кажется, проблема здесь в том, что в C# HTTP клиент не умеет выполнять javascript'ы, и подгрузка необходимой мне информации осуществляется чем-то типа AJAX'а, но подтверждений этому я не смог найти. Хотелось бы узнать, в чём тут причина и по возможности методы или подсказки, как эту проблему решить. Заранее спасибо.
Коды получаемых страниц: C# проект, Node.JS проект
Отправляемые данные:
группа: КІ-51м, %CA%B2-51%EC в дебаггере;
даты: 03.02.2020 - 07.02.2020
У вас запрос идёт не по тем URL. Вот так должно работать.
public static async Task PostRequestAsync()
{
string faculty = "13";
string teacher = "";
string group = "КІ-51";
string startDate = "01.01.2020";
string endDate = "07.02.2020";
string n = "700";
string urlRequest = "http://desk.nuwm.edu.ua/cgi-bin/timetable.cgi?n=700";
string postData = $"faculty={faculty}&teacher={teacher}&group={group}&sdate={startDate}&edate={endDate}&n={n}";
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
WebRequest request = WebRequest.Create(urlRequest);
request.Method = "POST";
byte[] byteArray = System.Text.Encoding.GetEncoding("windows-1251").GetBytes(postData);
request.ContentLength = byteArray.Length;
using (Stream dataStream = request.GetRequestStream())
{
await dataStream.WriteAsync(byteArray, 0, byteArray.Length);
}
WebResponse response = await request.GetResponseAsync();
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("windows-1251")))
{
string text = reader.ReadToEnd();
Console.WriteLine(text);
}
}
response.Close();
Console.WriteLine("Запрос выполнен...");
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как смоделировать сеть состоящую из сервера и нескольких рабочих машин,с возможностью моделирования скорости сетиЧто использовать WmWare?...
Использую в приложении(windows сервис) на C#, dll написаную на DelphiКод dll у меня есть
Есть две формы: на Form2 располагаются textbox1, button1 и checkbox1-2В ней пользователь вводит радиус окружности и выбирает при помощи checkbox режим вычислений...