私はコメントとしてこれを残すつもりでした。しかし、それはあまりにも大きくなり過ぎてひどくフォーマットされました。だからここに行く。
まず、このサイトは、ajaxコマンドで呼び出されるjavascriptを使用して動的に更新されます。
セッションを開き、SESSIONIDと現在「暗号化された」スクールネームを含むCookieを保存できる場合は、ajaxコマンドをそのように呼び出すことができます。
https://roosters.windesheim.nl/ajaxCommand=getWeeklyTimetable&elementType=1&elementId=13090&date=20171126&formatId=7&departmentId=0&filterId=-2
これは、elementTypeがどの要素であり、どのelementIdが何であるかを知る必要があります。
この場合、elementIdは1GLDに等しいときにKlasを参照します。また、formatID(7)はRoosterformaatが "Beknopt"に等しいときに参照します。残りの変数が何をしているのか把握しなければなりません。さらに重要な点は、サーバーに有効なajaxコマンドを作成することができれば、htmlを応答として取得できないことです。これはJSONでデータを受け取ることになります。
すべてのクラスを別々のfileにすることが、最も簡単な方法です。それを基準点として使用してください。他のオプションも同じです。
phantomjs.orgとSeleniumのようなヘッドレスブラウザを使用してください。この方法で、スクラップしたいクラスを見つけてクリックすることができます。 HTMLをHtmlAgilityPack.HtmlDocumentにロードしてから、必要な処理を行います。セレン/ PhantomJSあなたのクッキーを追跡するまで。 この方法は遅くなりますが、やりやすくなります。
EDIT Webリクエストからのクッキーの保存 - 簡単な方法。
私はこの件に熱心ではありません。しかし、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すれば、悪いです。しかし、明らかに、IDを持つコンテナが表示されるようにするには、最初に「Klas」の下にあるドロップダウンをクリックする必要があります。 – user3478148
まだコメントを確認する機会がありませんでした。私は自分のプロジェクトを続けます。 – user3478148