C#でサイトのデータ(HTML)を取得する方法

このQ&Aのポイント
  • C#を使ってサイトのデータ(HTML)を取得する方法について
  • サイトのデータを取得する際に、一部のサイトではソースが途切れる場合がある理由について
  • C#のRequestで取得した場合にソースが途切れる可能性がある原因について
回答を見る
  • ベストアンサー

サイトのデータ(HTML)を取得

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

  • ENTRE
  • お礼率0% (16/2523)

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

  • ベストアンサー
  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

恐らく、同期モードで読み込んでいるため、読み込み(受信)が完了する前に内部的で落ちちゃっているんじゃないかと思います。 だからといってRequestのTimeOut値を伸ばせばいいのかというと、後続の処理のレスポンスが悪化が懸念されます。 この場合、WebRequestの「BeginGetResponse」を使って、 非同期でWebRequestを読み込んであげる必要があると思います。 WebRequest webreq = (HttpWebRequest)WebRequest.Create(strURL); IAsyncResult r =(IAsyncResult) webreq.BeginGetResponse(new AsyncCallback(ResponseCallback), webreq); //非同期要求が終了した時に呼び出されるコールバックメソッド private static void ResponseCallback(IAsyncResult ar) {   // HttpWebRequestを取得   HttpWebRequest webreq = (HttpWebRequest) ar.AsyncState;   //非同期要求を終了   HttpWebResponse webres =(HttpWebResponse)webreq.EndGetResponse(ar); } 試していないので、質問に対する自信はありませんが、ご参考に なれば、幸いです。 詳細は、DOBON.NETさんの http://dobon.net/vb/dotnet/internet/webrequest.html にある、「非同期でダウンロードする」をご覧頂けたらと 思います。

参考URL:
http://dobon.net/vb/dotnet/internet/webrequest.html

関連するQ&A

  • C#でストリームの保存の仕方

    以下のコードのストリームstの保存を行いたいのですが、Streamのインスタンスをnewで作れないので どのようにすればよいでしょうか。お願いします。 HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create("http://www.***.co.jp"); HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse(); Stream st = webres.GetResponseStream();

  • 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# の HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strURL); でログインページにpostしてログオンしていますが、 たいていのページは HttpWebRequest でレスポンスが返ってくるのですが、 レスポンスがなし\"\"の場合があります。 ContentTypeもapplication/x-www-form-urlencoded で送信してるし、 たいていのページはこれでいけています。(ちょっと自身アリ) レスポンスのStreamを全く返さないページってありうるのでしょうか? (ブラウザではログインできます) (レスポンスのパラメータをチェックしましたが、リダイレクトらしきURLもなし) それともpost方法自体他の方法がある?? 漠然とした質問ですいません。

  • [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

  • C#でのWebRequestでのPOSTについて

    C#初心者です。 現在Visual Studio2012にてC#でストアアプリ作成中ですが、サーバーへPOSTしリストを取得する処理で難航しています。 WebRequest request = WebRequest.Create("URL"); request.Method = "POST"; byte[] byteArray = Encoding.UTF8.GetBytes(postData); request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = byteArray.Length; と記述した場合にrequest.ContentLengthの箇所でContentLengthはSystem.Net.WebRequestに定義が含まれていませんとエラーが表示されます。 何が足りないのでしょうか? 何か追加のアセンブリを指定する必要がありますでしょうか?

  • HTMLをマルチスレッド通信で取得する方法

    HTMLをマルチスレッドで通信して取得するソースを書いてみたのですが 動くことは動くのですが本当に以下ソースでできているのでしょうか。 やりたいこととしてはString[]配列に記述した3つのサイトに同時にアクセスしてHTMLを 取得するという処理を行いたいです。 run()メソッドの中身にマルチスレッドでやりたい処理を書けば上記の望みは叶えられるもの なのでしょうか。 package multiThreadTest; public class test { public static void main(String[] args) { String[] listUrls = {"http://www.yahoo.co.jp", "http://www.google.co.jp", "http://httpd.apache.org"}; ExThread ex = new ExThread(listUrls); ex.run(); } } public class ExThread { private String[] listUrls; ExThread(String[] listUrls) { this.listUrls = listUrls; } public void run() { for(String strUrl : listUrls) { String strHtml = Getter.getHtml(strUrl); //HTMLを取得する処理 System.out.println(strHtml); } } }

    • ベストアンサー
    • Java
  • C#でHP上の特定データを自動更新で抽出したい

    ブラウザを立ち上げることなくHPに自動ログイン後、特定の表示データを抽出してリアルタイムに更新表示させたい(ブラウザでは更新ボタンのクリックが必要)。 ニコニコ動画の自動ログイン方法が公開されていますのでそれを真似て下記のプログラムを作成し、見かけ上は正常に動作していますが、これって「GetHtml」を呼ぶ度にログイン → ログアウトを繰り返すのでしょうか? もし、そうであればそれの回避方法を教えて頂けないでしょうか。(.Close()を呼ばないとか?) また、その確認方法があれば併せてお願いします。 /// ログイン (起動時1回のみ呼び出し) public bool LogIn() {  Hashtable hash = new Hashtable();  hash["username"] = "name";  hash["password"] = "123";  hash["Login"] = "login";  string s_param = "";  foreach (string s in hash.Keys)  {  s_param += string.Format("{0}={1}&", s, hash[s]);  }  HttpPost("Https", s_param); } /// POST送信 public void HttpPost(string s_url, string s_param) {  httpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  CookieContainer cookieContainer = new CookieContainer();  httpWebRequest.CookieContainer = cookieContainer;  httpWebRequest.ContentType = "application/x-www-form-urlencoded";  byte[] data = Encoding.ASCII.GetBytes(s_param);  httpWebRequest.ContentLength = data.Length;  httpWebRequest.Method = "Post";  Stream reqStream = httpWebRequest.GetRequestStream();  reqStream.Write(data, 0, data.Length);  reqStream.Close();  WebResponse webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  encoder = Encoding.GetEncoding("Shift_JIS");  StreamReader streamReader = new StreamReader(resStream, encoder);  spHtml = streamReader.ReadToEnd();  streamReader.Close();  webResponse.Close(); } /// HTML受信(タイマーイベントで常時呼び出し) private string GetHtml(string s_url) {  httpWebRequest = (HttpWebRequest)WebRequest.Create(s_url);  httpWebRequest.CookieContainer = cookieContainer;  webResponse = httpWebRequest.GetResponse();  Stream resStream = webResponse.GetResponseStream();  StreamReader streamReader = new StreamReader(resStream, encoder);  string Html = streamReader.ReadToEnd();  streamReader.Close();  resStream.Close();  return Html; }

  • Javascriptで外部HTMLの値を取得したい

    WEB初心者です。 Javascriptを使用して、 外部HTMLソースを取得し、その中のある値だけを取得するロジックをご教示ください。 取得した外部HTMLソースに正規表現が使えるなら、下記になるかと思います。 /_xyz" value="([^<]+)">/ キャプチャした値を呼び出し元のHTMLで使用したいです。 ”こんな感じのロジックになります”とご教示いただけますとたすかります。 よろしくお願いいたします。 下記サンプルプログラムを見つけたのですが、 ソース全体ではなくソースの中のある値だけが欲しいです。 --------------------------------------------------------------------------------------------- <?xml version="1.0"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>javascriptでHTMLのソースを取得</title> <script language="javascript" type="text/javascript"> function createhttprequest(){ var request=null; if("XMLHttpRequest" in window){ request= new XMLHttpRequest(); } else if("ActiveXObject" in window){ try{ request=new ActiveXobject("Msxml2.XMLHTTP"); }catch(e){ try{ request=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ } } } return request; } var request; function requestsorce(url){ request=createhttprequest(); request.open("GET",url,true); request.onreadystatechange=sorceget; request.send(null); } function sorceget(){ if (request.readyState == 4 && request.status == 200){ document.form1.sorce.value=request.responseText; } else{ } } </script> </head> <body> テキストボックスにurlを入力してソース取得ボタンを押してください。 <form name="form1"> <input type="text" name="urlbox" size="40"> <input type="button" value="ソース取得" onclick="requestsorce(document.form1.urlbox.value)"> <textarea name="sorce" rows="120" cols="100"> ここにソースを表示 </textarea> </form> </body> </html>

  • ASPでほかのサイトのソースを取得したい

    はじめまして。 ASPでほかのサイトのソースを取得したいと思って試行錯誤しましたが、立ち往生してしまいました。 やりたいことをわかりやすく説明しますと 自分のサイト(ASP)でたとえばYahoo!(HTML)のHTMLソースを取得で特定の文字列を検出したいと考えています。 ASPでサーバー側でVBS実行してIEを起動しYahooを表示させようとしたらVBSの実行権限やProxyの問題でHTMLソースを取得できませんでした。 翻訳サイトなどでは自分のサイト以外のサイトのデータを取得して加工を加えていることを考えるとできると思うのですが、どのようにやったらいいのでしょうか? ご存知の方いらっしゃいましたら、よろしくお願い致します。

  • webbrowserでのjavascriptを含むソース取得

    webbrowserでのjavascriptを含むソース取得 お世話になっております。 VB 2005を利用しています。 webbrowserを用いてHTMLソースの表示をしようと、 WebBrowser1.Document.Body.OuterHtml と記述したところ、javascriptのソースが表示されません。 同じサイトをIEのソースで表示すると問題なく表示できます。 HttpWebRequest を用いたソースの取得方法はわかるのですが、 事情があって、webbrowser上から行いたいのです。 よろしくアドバイスの程お願いいたします。

専門家に質問してみよう