[C#]htmlを取得できないページがある

このQ&Aのポイント
  • C#でhtmlソースを取得する方法について質問です。取得できるページと取得できないページがあり困っています。
  • 取得方法としてHttpWebRequestを使用していますが、取得できないページのソースは予想と異なります。
  • ユーザーエージェントを設定しても結果は同じです。取得できるページの例と取得できないページの例を提供します。
回答を見る
  • ベストアンサー

[C#]htmlを取得できないページがある。

C#でhtmlソースを取得したいのですが、取得できるページと出来ないページがあって困っています。 取得方法は以下の方法を使用しています。 ===ここから=== HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest; HttpWebResponse res = null; try { res = req.GetResponse() as HttpWebResponse; } catch { MessageBox.Show(url + "指定した Web ページが応答していません!", "エラー"); } StreamReader reader = new StreamReader(res.GetResponseStream(), Encoding.GetEncoding(encode)); string htmlsource = reader.ReadToEnd(); reader.Close(); =================== htmlsourceにソースが入るのですが、取得できないページも一応ソースは取得できるのですが、 実際にIEなどのブラウザで表示した場合のソースと異なります。 ユーザーエージョンとして req.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0"; を設定しても結果は同じでした。 ■取得できるページ例 http://www.amazon.co.jp/s/ref=sr_nr_n_1/375-1273809-4334332?rh=n%3A465392%2Cn%3A!465610%2Cn%3A571582&bbn=465610&ie=UTF8&qid=1376454464&rnid=465610&lo=stripbooks ■取得できないページ例 http://www.amazon.co.jp/s/ref=sr_nr_n_3?rh=n%3A465392%2Cn%3A!465610%2Cn%3A492152&bbn=465610&ie=UTF8&qid=1376454590&rnid=465610&lo=stripbooks

  • macus
  • お礼率76% (331/433)

質問者が選んだベストアンサー

  • ベストアンサー
noname#251971
noname#251971
回答No.1

どういう差異が出ているのかわかりませんが、 セッションIDが埋め込まれたような箇所が変化するというのであれば、 それは変化することが当然なのでそれを前提に処理するべきかと思います。 それ以外の違いがあるとしたら、 以下のような点が要因となっている可能性はあるのでは無いでしょうか。 ・JavaScriptなどのスクリプトでページ内容が動的構成されている ・Cookieによってサーバーが異なるHTMLを返却している ブラウザ側でページを開く際、 JavaScriptを無効にしてページを開いたり、 Cookieを削除してページを開いたりしてソースを比べてみてはどうでしょうか。

macus
質問者

お礼

ありがとうございます!! 何とかできました!!!

関連するQ&A

  • フォト蔵へアップロードできません(C#)

    フォト蔵へアップロードするとエラー400が出てしまいます。 何が原因なのでしょうか?原因を教えてください。 以下コード //フォト蔵へのアップロード(注意動きません)// //送信するファイルのパス filePath="C:\\Users\\Public\\Pictures\\Sample Pictures\\test.jpg"; //送信先のURL string url1 = "http://api.photozou.jp/rest/photo_add"; //文字コード System.Text.Encoding enc = System.Text.Encoding.GetEncoding("UTF-8"); //WebRequestの作成 System.Net.HttpWebRequest req = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url1); //メソッドにPOSTを指定 req.Method = "POST"; //ベーシック認証宣言、アカウントとパスワード req.PreAuthenticate = true; NetworkCredential network = new NetworkCredential("mailaddress@hoge.com", "password"); req.Credentials = network; //ヘッダを設定 req.Headers.Add("album_id", "1234567"); //ContentTypeを設定 req.ContentType = "image/jpeg"; //POST送信するデータを作成 System.IO.FileStream fs = new System.IO.FileStream( filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); //POST送信するデータの長さを指定 req.ContentLength = fs.Length; //データをPOST送信するためのStreamを取得 System.IO.Stream reqStream = req.GetRequestStream(); //ファイルの内容を送信 byte[] readData = new byte[0x1000]; int readSize = 0; while (true) { readSize = fs.Read(readData, 0, readData.Length); if (readSize == 0) break; reqStream.Write(readData, 0, readSize); } fs.Close(); reqStream.Close(); //サーバーからの応答を受信するためのWebResponseを取得 System.Net.HttpWebResponse res = (System.Net.HttpWebResponse) req.GetResponse(); //応答データを受信するためのStreamを取得 System.IO.Stream resStream = res.GetResponseStream(); //受信 System.IO.StreamReader sr = new System.IO.StreamReader(resStream, enc); //閉じる sr.Close();

  • [LWP?] 特定のCLASSの値だけ取得したい

    LWPを使って、特定のWebページを取得しました。 -- use LWP::UserAgent; $ua = LWP::UserAgent->new; $ua->agent("$0/0.1 " . $ua->agent); $req = HTTP::Request->new(GET => 'http://www.yahoo.co.jp/'); $req->header('Accept' => 'text/html'); # リクエストの送信 $res = $ua->request($req); # 出力のチェック if ($res->is_success) { print $res->content; #←ここが取得したあいたいです。 } else { print "Error: " . $res->status_line . "\n"; } -- この中から指定したclassのinnerTextだけ取得したいのですがどのようにしたらよいのでしょうか? 要は$res->contentに -- <BODY> <UL> <LI class=aaa>xxx1</LI> <LI class=aaa>xxx2</LI> <LI class=aaa>xxx3</LI> </UL> <UL> <LI class=bbb>yyy1</LI> <LI class=bbb>yyy2</LI> <LI class=bbb>yyy3</LI> </UL> </BODY> -- のような値が入っていてclass=bbbの「yyy1」~「yyy3」だけ取得したいのですが。 よろしくお願い致します。 (参考)LWP http://homepage3.nifty.com/hippo2000/perltips/LWP.html

    • ベストアンサー
    • Perl
  • C#でIEの操作ができないページの操作方法

    C#でIEを操作しようとしているのですが、HTMLを取得する際にエラーが出てしまします。なぜでしょうか? yahooなどのサイトのHTMLは取得できるのですが、実際にhtmlを取得したいサイトは「型 'System.Net.WebException' のハンドルされていない例外が System.dll で発生しました 追加情報:接続が切断されました: 送信時に、予期しないエラーが発生しました。」とエラーがでます。 HTMLが取得できないサイトがあるのでしょうか? その時にどうすればHTMLを取得し、操作できるのかその方法を教えてください。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Encoding enc = Encoding.GetEncoding("Shift_JIS"); string url = "https://www.yahoo.co.jp/"; WebRequest req = WebRequest.Create(url); WebResponse res = req.GetResponse(); Stream st = res.GetResponseStream(); StreamReader sr = new StreamReader(st, enc); string html = sr.ReadToEnd(); sr.Close(); st.Close(); Console.WriteLine(html); } } }

  • ページのタイトル

    googleだけページタイトルが取得できません。 何方か、ご教授して頂けないでしょうか。 ---結果--- 403 Forbidden Yahoo!検索 - テスト [テスト] goo ウェブ検索結果 Excite エキサイト 検索結果 : テスト テスト - infoseek 検索 ---cgi--- #!/usr/bin/perl use LWP::UserAgent; use HTTP::Request; require './jcode.pl'; print "Content-type:text/html;charset=Shift_JIS\n\n"; print "<html><head>\n"; print "<title>ddd</title></head>\n"; print "<body>\n"; @data[0] = "http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&oe=Shift_JIS&c2coff=1&q=%83e%83X%83g&btnG=Google+%8C%9F%8D%F5&lr="; @data[1] = "http://search.yahoo.co.jp/bin/search?p=%A5%C6%A5%B9%A5%C8"; @data[2] = "http://search.goo.ne.jp/web.jsp?TAB=&MT=%A5%C6%A5%B9%A5%C8"; @data[3] = "http://www.excite.co.jp/search.gw?target=combined&look=excite_jp&lang=jp&search=%83e%83X%83g"; @data[4] = "http://www.infoseek.co.jp/OTitles?qt=%A5%C6%A5%B9%A5%C8&col=OW"; foreach $url (@data) { $test = &gettitle($url); &jcode::convert(\$test,'sjis'); print "$test<br>"; } sub gettitle { my $url = shift or return undef; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $url); $req->header("Accept" => "text/html"); my $res = $ua->request($req, sub { my($chunk, $res) = @_; die if ($res->title or ($chunk =~ m{</head}i)); }); return $res->title; } print "</body></html>\n";

    • ベストアンサー
    • Perl
  • LWPでHTTPSサイトからコンテンツ取得

    LWP::UserAgentを使用してHTTPSサイトから、 コンテンツを取得して解析処理をしたいのですが、 取得できなくて困っています。 Crypt::SSLeayやopensslを入れてアクセスは出来るようになったのですが、 HTTPサイトの場合 $ua = LWP::UserAgent->new; my $Req = HTTP::Request->new('GET', 'http://~'); my $Res = $ua->request($Req); my $content = $Res->content; これで、コンテンツのソースを取得できたのですが、 同じ用にhttpsサイトから取得しようしても 「<HTML></HTML>」だけしか取得できませんでした。 ちなみに my $content = $Res->as_string; としてみると、 HTTP/1.0 200 OK Content-Type: text/html Client-Date: Thu, 08 Dec 2005 08:01:10 GMT Client-Peer: *.*.*.*:8080 ←隠させてもらいます Client-Response-Num: 1 Refresh: 0; URL=https://~ という取得したいHTTPSサイトにジャンプするような 内容が取得できました。 どうにかしてコンテンツ内容を取得したいのですが、 そもそもHTTPSのコンテンツ内容を取得すること自体 出来ないのでしょうか? その場合代案等もありましたら、教えてください。 とても困っています。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • サイトのデータ(HTML)を取得

    C#で WebRequest webreq = (HttpWebRequest)WebRequest.Create(strURL); webreq.Timeout = 10000; HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse(); でサイトのデータ(HTML)を取得しているのですが、 サイトによっては1ページ全部取得できない場合があります。 しかしブラウザで見ると全部表示され、 そのソースをみても全部表示されています。 なぜC#のRequestで取得した場合には、 ソースが途切れる場合があるのでしょうか? 取得中タイムとかの設定があるのでしょうか? よろしくお願いします。

  • Perl HTMLソースから特定のタグ抽出

    use LWP::UserAgent; use HTTP::Request; use HTTP::Response; our $URL = 'https://www.yahoo.co.jp/'; # アクセスする URL my $proxy = new LWP::UserAgent; $proxy->agent('your own created browser name here'); # 任意 $proxy->timeout(60); # 任意 my $req = HTTP::Request->new('GET' => $URL); my $res = $proxy->request($req); my $content = $res->content; print "Content-Type: text/html\n\n"; # HTML ヘッダ (CGI として動作できる) if($res->is_success) { print $content; } else { print 'HTTP エラーコード: ' . $res->code; } これで、HTMLソース全てを取得することはできましたが、 例えば、このソースはヤフーのコードを取得していますが、 ヤフーのコード内で<li></li> リストタグないの文字列がほしいのですが、 どのように抽出すればいいのでしょうか? ヤフーでは、下記のようになっていて <li><a hrf="???????????????">ここの文字列<span>写真</span><span>new</span></li> このソースからここの文字列を抽出させたいです。 さらに、1番目の<li>内、4番目の<li>内といったことも実行したいです。 どうかご教示お願い致します。

  • Javascriptでページ取得したい

    いつもお世話になっています。 スマホサイトにて、キャリアごとにhtaccessで振り分けを行っていますが、 「PCサイトへ移動」ボタンを押したら、PCページへ移動させたいのです。 追加条件として、PC版のTOPページではなく、「今見ているスマホページのPC版ページ」へ移動させたいのです。 <a href="http://aaaaa.jp/bbb/ccc.html?mode=pc">PC版サイトはこちらから</a> と一つ一つ全ページに入れていくのは大変なので http://aaaaa.jp/bbb/ccc.html この部分をJavascriptで自動取得したいです。 <a href="【jsで自動取得】?mode=pc">PC版サイトはこちらから</a> のようなイメージです。 そもそも可能でしょうか? 可能であればソースまで教えていただけると助かります。 宜しくお願い致します。

  • HTTPSのサイトからのダウンロード方法

    HTTPSのサイトにアクセスしてブラウザではなくテキストで表示させるにはどうすればいいのでしょうか? 通常のHTTPのサイトからは下記のコードで動作するようになりました。 これでHTTPSのサイトにアクセスしても返事が返ってきません。 今アクセスしようとしているページはまだユーザー名、パスワードが不用なページです。 ブラウザで表示させれば問題なく表示されます。 ご存知の方は教えて下さい。 [サンプルコード] Private Sub btnConnect_Click(ByVal sender As System.Object,_    ByVal e As System.EventArgs) Handles btnConnect.Click 'HttpWebRequestの作成 Dim strURL As String txtResponce.Text = "" txtResponce.Refresh() If Me.rbULR1.Checked Then strURL = txtURL1.Text Else strURL = txtURL2.Text End If Dim webreq As System.Net.HttpWebRequest = _ CType(System.Net.WebRequest.Create(strURL), _ System.Net.HttpWebRequest) 'サーバーからの応答を受信するためのHttpWebResponseを取得 Dim webres As System.Net.HttpWebResponse = _ CType(webreq.GetResponse(), System.Net.HttpWebResponse) '文字コードを指定する Dim enc As System.Text.Encoding = _ System.Text.Encoding.GetEncoding(932) '応答データを受信するためのStreamを取得 Dim st As System.IO.Stream = webres.GetResponseStream() Dim sr As New System.IO.StreamReader(st, enc) '受信して表示 Me.txtResponce.Text = sr.ReadToEnd() '閉じる sr.Close() End Sub

  • C#で空白行を削除する方法

    C#でテキストを読み込んで、文字列型の変数に代入、そしてtextBoxに表示させます。その中にいくつかの空白だけの行があります。その空白行だけを削除する方法がわかりません。わかる方がいらっしゃいましたらよろしくお願いします。 FileStream file = File.Open(@"C:\text.txt",FileMode.Open); Encoding enc = Encoding.GetEncoding("Shift_JIS"); StreamReader reader = new StreamReader(file,enc); string A = reader.ReadToEnd(); A = Regex.Replace(A,"\r\n",""); textBox1.Text = A; とすると全ての改行が削除されてしまいます。 正規表現をうまくつかうと出来るような気がするんですが・・・

専門家に質問してみよう