我要離開這個註釋。但它格式太大,格式太差。所以,我們走了。
首先,該網站使用通過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