2

問題

私のc#Webリクエストによって取得されたhtmlページは、ブラウザーを使用して取得したものとは異なります。

詳細

このURLで参照されているページのHTMLを取得しようとしています:

https://sistemas.usp.br/jupiterweb/listarGradeCurricular?codcg=12&codcur=12012&codhab=1&tipo=N

私がWebRequestに使用しているコードはこれです:

public string HttpsGet (string url)
{
    string response = string.Empty;
    if (!string.IsNullOrEmpty(url))
    {
        HttpWebRequest WReq = (HttpWebRequest)WebRequest.Create("https://uspdigital.usp.br/jupiterweb/listarGradeCurricular?codcg=9&codcur=9012&codhab=100&tipo=N");
        WReq.Credentials = CredentialCache.DefaultCredentials;

        ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

        try
        {
            WReq.Proxy = new WebProxy();
            WReq.Method = "GET";
            WReq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1";
            WReq.ServicePoint.ConnectionLimit = 800;
            WReq.Timeout = 80000;
            WReq.ContentType = "application/x-www-form-urlencoded";
            WReq.Referer = "";
            WReq.AllowAutoRedirect = true;

            HttpWebResponse resp = (HttpWebResponse)WReq.GetResponse();
            using (resp)
            {
                response = (new StreamReader(resp.GetResponseStream(), Encoding.GetEncoding("ISO-8859-1"))).ReadToEnd();
            }
        }
        catch (Exception exception)
        {
            Exception ex = exception;
        }
        return response;
    }
    else
    {
        throw new Exception("URL is empty or null");
    }
}

それらが異なっていることを私がどのように理解したか

コードから取得したHTMLとブラウザから取得したHTML(Chromeでソースコードを表示)の両方をnotepad++に貼り付けました。

その後、いくつかのテーブル行の背景色を表すこの文字列「#CCCCCC」を「カウント」(ctrl + f->カウント)することができました。

webrequestのものは私に17のカウントを与え、browseroneは私に14のカウントを与えます。

また、各ページの「コース」は異なります。ウェブリクエストコースは「FaculdadedeCiênciasFarmacêuticas」ですが、ブラウザのコースは「Faculdade de Economia、AdministraçãoeContabilidade」です(これらの名前はポルトガル語です)。

TL:DR

理由はわかりません。このリンクにアクセスhttps://uspdigital.usp.br/jupiterweb/listarGradeCurricular?codcg=12&codcur=12012&codhab=1&tipo=Nすると、Webリクエストc#で、ブラウザにコピーして貼り付けたときの結果とは異なるページが表示されます。

更新

  1. 両方のリクエストのユーザーエージェントを比較しようとしましたが、一致しています。

  2. C#を介したWebリクエストでは、常に同じページが表示されることがわかりました。これは、「FaculdadedeCiênciasFarmacêuticas」コースのページです。

HTTPSのことと関係があると思います。

よろしくお願いします。長い投稿でごめんなさい

4

2 に答える 2

4

ブラウザのユーザー エージェント文字列を見つけて、一致するように WebRequest のユーザー エージェント文字列を設定します。多くのサイトは、UA に基づいてバリアント コンテンツ/マークアップ/スタイル/スクリプトを提供しています。

アップデート

HttpWebRequest を使用している場合は、UserAgent プロパティで UA を設定できます。

于 2012-07-09T14:53:33.333 に答える
0

ホストをに設定uspdigital.usp.brし、URL の「sistemas」という単語を「uspdigital」に置き換えるとうまくいくようです。

于 2012-07-09T17:22:18.020 に答える