Web をクロールしようとしていますが、.netHttpRequest
とHttpResponse
クラスを使用してログインできません。ネット モニタを使用すると、主な違いは、ブラウザからのログインでは POST メッセージにペイロードが含まれているのに対し、HttpRequest
ではペイロードが別のメッセージで送信され、301 応答が返されることです。単一のメッセージを使用する方法はありますか? それとも、私が見逃しているものがありますか?このコードを別の Web サイトで使用しましたが、うまくいきました。
// Set GET to logon site.
SiteRequest = (HttpWebRequest)WebRequest.Create(logonUrl);
SiteRequest.Method = "GET";
SiteRequest.AllowAutoRedirect = AllowRedirect;
SiteRequest.CookieContainer = SiteCookieContainer;
SiteRequest.Referer = logonUrl;
SiteResponse = (HttpWebResponse)SiteRequest.GetResponse();
mainStream = SiteResponse.GetResponseStream();
ReadAndIgnoreAllStreamBytes(mainStream);
mainStream.Close();
// Send POST to logon site.
SiteRequest = (HttpWebRequest)WebRequest.Create(postUrl);
SiteRequest.Method = "POST";
SiteRequest.AllowAutoRedirect = AllowRedirect;
SiteRequest.ContentType = "application/x-www-form-urlencoded";
SiteRequest.CookieContainer = SiteCookieContainer;
SiteRequest.CookieContainer.Add(SiteResponse.Cookies);
SiteRequest.Referer = postUrl;
SiteRequest.Timeout = TimeoutMsec;
buffer = Encoding.UTF8.GetBytes(logonPostData);
SiteRequest.ContentLength = buffer.Length;
postStream = SiteRequest.GetRequestStream();
postStream.Write(buffer, 0, buffer.Length);
postStream.Flush();
postStream.Close();
SiteResponse = (HttpWebResponse)SiteRequest.GetResponse();
HtmlAgilityPack で HtmlWeb クラスを使用すると、同じ問題が発生します。
ありがとう。
アップデート:
「example.com」ではなく「www.example.com」形式のアドレスを使用していたことが判明したため、リダイレクトされました。しかし、正しいアドレスで「404」ページが見つからないというエラーが表示されます。
ブラウザが投稿のために送信しているものは次のとおりです。
- Http: Request, POST /accounts/signin
Command: POST
+ URI: /accounts/signin
ProtocolVersion: HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://***.com/accounts/signin
Accept-Language: en-US,en;q=0.8,zh-Hans-CN;q=0.7,zh-Hans;q=0.5,zh-Hant-TW;q=0.3,zh-Hant;q=0.2
UserAgent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)
+ ContentType: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: example.com
ContentLength: 67
DNT: 1
Connection: Keep-Alive
Cache-Control: no-cache
- Cookie: PHPSESSID=169***efe; lang=en_US; cart=eyJ***wfQ%3D%3D; cartitems=W10%3D; __utma=***; __utmb=***; __utmc=**; __utmz=**
PHPSESSID: 169***efe
lang: en_US
cart: eyJ***wfQ%3D%3D
cartitems: W10%3D
__utma: ***
__utmb: ***
__utmc: ***
__utmz: ***
HeaderEnd: CRLF
- payload: HttpContentType = application/x-www-form-urlencoded
url:
email: ***
password: ***
ここに私が送っているものがあります:
(役職:)
- Http: Request, POST /accounts/signin
Command: POST
+ URI: /accounts/signin
ProtocolVersion: HTTP/1.1
+ ContentType: application/x-www-form-urlencoded
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US,en;q=0.8,zh-Hans-CN;q=0.7,zh-Hans;q=0.5,zh-Hant-TW;q=0.3,zh-Hant;q=0.2
Accept-Encoding: gzip, deflate
DNT: 1
Cache-Control: no-cache
Referer: http://***.com/accounts/signin
Host: chinesepod.com
- Cookie: lang=en_US; cart=eyJ***jowfQ%3D%3D; cartitems=W10%3D; PHPSESSID=944***3e7
lang: en_US
cart: eyJ***wfQ%3D%3D
cartitems: W10%3D
PHPSESSID: 944***3e7
ContentLength: 61
HeaderEnd: CRLF
(別のペイロード:)
- Http: HTTP Payload, URL: /accounts/signin
- payload: HttpContentType = application/x-www-form-urlencoded
url:
email: ***
password: ***
ブラウザー バージョンには、これらの __utXX Cookie があります。これは、ブラウザーが何らかのタグ付けのために追加すると想定していますよね? それ以外の場合の主な違いは、Cookie の順序が問題にならないと仮定すると、ペイロードが個別に送信されることです。他に何か問題がありますか?
ありがとう。
-ジョン