我要离开这个注释。但它格式太大,格式太差。所以,我们走了。
首先,该网站使用通过ajaxcommand调用的JavaScript动态更新。
如果你可以打开一个会话,并存储包含SESSIONID和现在的“加密” schoolname,那么你可以调用Ajax的命令,这样的饼干。
https://roosters.windesheim.nl/ajaxCommand=getWeeklyTimetable&elementType=1&elementId=13090&date=20171126&formatId=7&departmentId=0&filterId=-2
但是,这确实需要你知道elementType是什么和elementId是什么。
在这种情况下,elementId在Klas等于1GLD时表示Klas。 formatID(7)在等于“Beknopt”时表示Roosterformaat。你必须弄清楚剩余变量的作用。更重要的是,如果您成功地向服务器发出了有效的ajax命令,那么您将不会返回HTML作为响应,您将以JSON接收数据。
做你想做的最简单的方法是在一个单独的file所有类。并将其用作参考点。其他选项也一样。
,然后使用一个无头的浏览器,如phantomjs.org与Selenium。通过这种方式,您可以找到并点击您想要抓取的课程。将HTML加载到HtmlAgilityPack.HtmlDocument中,然后执行您需要执行的操作。 Selenium/PhantomJS直到跟踪你的cookies。 这种方法比较慢 - 但要容易得多。
编辑从webrequest存储cookie - 简单的方法。
我并不热衷于这个问题。但OP问。如果有人有更好的方法,请编辑。
CookieContainer cookies = new CookieContainer();
try
{
string webAddr = "https://roosters.windesheim.nl/WebUntis/";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = "POST";
httpWebRequest.CookieContainer = cookies;
httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
httpWebRequest.Headers.Add("X-Requested-With", "XMLHttpRequest");
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = "ajaxCommand=getWeeklyTimetable&elementType=1&elementId=13092&date=20171126&formatId=7&departmentId=0&filterId=-2";
streamWriter.Write(json);
streamWriter.Flush();
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
cookies.Add(httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri));
//cookies.Add(httpResponse.Cookies);
var responseText = streamReader.ReadToEnd();
doc.LoadHtml(responseText);
foreach(Cookie c in httpResponse.Cookies)
{
Console.WriteLine(c.ToString());
}
}
}
catch (WebException ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine(doc.DocumentNode.InnerHtml);
Console.ReadKey();
你究竟想要刮到什么?我访问过这个网站并没有看到任何Timetable_toolbar_elementSelect_popup0。 – derloopkat
@derloopkat对不起,如果您在菜单中的“Lesrooster”和“Klassen”上的klik,您将在右页。然而,显然你还需要先点击“Klas”下的下拉菜单,才能看到带有id的容器。 – user3478148
我还没有机会检查评论,Kent ...我会这么做当我继续我的项目。 – user3478148