0

解析 (スクレイプ) するページがありますが、まず制御手段を渡す必要があります。
なんとか計算できた管理番号がいくつかあります.POSTメソッドのパラメータを介してこれらの管理番号やその他のものを渡そうとすると、ページが更新されて新しい管理番号が生成されるので、計算したものがチェックに合格せず、失敗します目的のページにアクセスします。

最初に、HtmlAgilityPack メソッドを含むページを取得し、これらのコントロール番号の値を取得します。

HtmlWeb web = new HtmlWeb();
HtmlDocument mainPage = web.Load(url);
int controlNumber = FindControlNumber();

その直後に、計算された数値を POST メソッドで渡そうとします:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string data = @"id=" + id + "&controlNumber=" + controlNumber;
byte[] dataStream = Encoding.UTF8.GetBytes(data);
request.ContentLength = dataStream.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(dataStream, 0, dataStream.Length);
newStream.Close();
HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(webResponse.GetResponseStream());
string html = sr.ReadToEnd();

しかし、目的のページに移動する代わりに、最初のページに「間違った管理番号」というメッセージが表示されます。

私は何を間違っていますか?

4

1 に答える 1

0

実際、私がしなければならなかったことは、Cookie を設定し、HPA の HtmlWeb の代わりに WebRequest と WebResponse を使用することだけでした。
動作するコードは次のとおりです。

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.KeepAlive = true;
        CookieContainer cookies = new CookieContainer(); // instantiate cookie container

        request.CookieContainer = cookies;

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        var stream = response.GetResponseStream();

        // Calculate control number...

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        string data = @"id=" + id + "&controlNumber=" + controlNumber;
        byte[] dataStream = Encoding.UTF8.GetBytes(data);
        request.ContentLength = dataStream.Length;

        request.CookieContainer = cookies;

        Stream newStream = request.GetRequestStream();
        newStream.Write(dataStream, 0, dataStream.Length);
        newStream.Close();
        HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
        StreamReader sr = new StreamReader(webResponse.GetResponseStream());
        string html = sr.ReadToEnd();
于 2013-07-30T11:29:57.657 に答える