質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

1495閲覧

C#でHTMLや画像がダウンロードできない問題

skytomo

総合スコア35

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/08/29 08:11

編集2018/08/29 10:21

前提・実現したいこと

初心者です。
私情で、You Tubeにある字幕が書かれているxmlデータをC#でダウンロードしてみようと思ったところ、例外が発生してしまいました。
そこで、とりあえず、エラーの原因を探るために、
https://www.google.co.jp/のHTMLをダウンロードする」という単純なプログラムを作ったところ、
同じような例外が投げられました。
最終的にはYoutubeの字幕ファイルをダウンロードできようにしたいですが、
この質問では、とりあえず「HTMLをダウンロードする」ことを実現したいです。

cs

1using System.IO; 2using System.Net; 3using System.Windows.Forms; 4using System.Xml; 5 6namespace YoutubeSubtitlesProject 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 14 System.Net.WebClient wc = new System.Net.WebClient(); 15 wc.DownloadString("https://www.google.co.jp/"); // ここで例外 16 wc.Dispose(); 17 18 } 19 } 20}

発生している問題・エラーメッセージ

System.Net.WebException HResult=0x80131509 Message=リモート サーバーに接続できません。 Source=System スタック トレース: 場所 System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request) 場所 System.Net.WebClient.DownloadString(Uri address) 場所 System.Net.WebClient.DownloadString(String address) 場所 YoutubeSubtitlesProject.Form1..ctor() (C:\Users\skytomo\source\repos\YoutubeSubtitlesProject\YoutubeSubtitlesProject\Form1.cs):行 20 場所 YoutubeSubtitlesProject.Program.Main() (C:\Users\skytomo\source\repos\YoutubeSubtitlesProject\YoutubeSubtitlesProject\Program.cs):行 19 内部例外 1: SocketException: アクセス許可で禁じられた方法でソケットにアクセスしようとしました。 172.217.25.99:443

該当のソースコード

wc.DownloadString("https://www.google.co.jp/");

試したこと

Yahooで試したりしましたが同じ結果です。
また、画像(jpg)などを落とそうと思ってやってみましたが、同じ理由でダメでした。
色々、ググって調べてみましたが、こういう例外が投げられる理由についてわかりませんでした。
(訂正)超メジャーなサイトだと相手のサーバーに拒否される可能性があるそうなので、
はてなブログのサイトとか宇宙天気ニュース(http://swnews.kagoshima-ct.ac.jp/)
苦しんで覚えるC言語(https://9cguide.appspot.com/)などでも再度試してみましたが、
どれも「アクセス許可で禁じられた方法でソケットにアクセスしようとしました。」という例外が投げられてしまいます。

補足情報

OS: Windows10
ネット環境:Wi-Fi
統合開発環境: Visual Studio 2017
ターゲットネットフレームワーク: .NET Framework 4.6.1

WebBrowserも動かないです。

回答ありがとうございます。
WebBrowserを使ってみましたが結果は、
「Web ページへのナビゲーションは取り消されました」
と表示されてしまいました。
「ページを最新の情報に更新する。」
をクリックすると、
「このページを表示できません」
「Web アドレス https://teratail.com が正しいか確かめてください」
と表示され、しかたなく
「Bing でこのサイトを検索」
をクリックすると、
「このページを表示できません」
「Web アドレス https://www.bing.com が正しいか確かめてください」
と表示されてしまいました。(つまりBingすらつながらない)
ちなみにローカルのHTMLファイルはちゃんと表示されます。

cs

1using System; 2using System.Windows.Forms; 3 4namespace WebBrowserProject 5{ 6 public partial class Form1 : Form 7 { 8 public Form1() 9 { 10 InitializeComponent(); 11 12 webBrowser1.Navigate(@"https://teratail.com/questions/30410"); 13 14 Console.WriteLine(webBrowser1.DocumentText); 15 } 16 } 17}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/08/29 08:15

相手のサーバー側で拒否されてる可能性は高いですよ。提示のような確実に何か対策されているであろう超メジャーどころではなくもっと別のページで試してみてください。
m.ts10806

2018/08/29 08:34

ご自身でもってる非SSLの静的ページとかないですか?またそのコードを組んだ際に参考にしたページなどもあれば
guest

回答4

0

JavaScript を使って動的に画像などのデータを取得して表示しているようなページを WebClient とか HttpClient で要求しても、WebClient とか HttpClient では JavaScript が動かないので何ともなりません。

「You Tubeにある字幕が書かれているxmlデータ」というのがどのようにレンダリングされているかは知りませんが、JavaScript などを使って動的に取得しているとすると、同様に何ともなりません。

WebBrowser の使用を検討してみてください。少なくとも、WebClient とか HttpClient よりは可能性は高いです。

それでも Google はダメです。WebBrowser を使っても何ともなりません。API が提供されているのでそれを使うほかないです。

投稿2018/08/29 09:52

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

https://stackoverflow.com/questions/25562434/sftp-in-c-sharp-using-a-webclient

理由はこれかなぁ。SSH接続に対応してない。
WebClientは、過去の遺物なので、HttpClientを使いましょう。

https://qiita.com/rawr/items/f78a3830d894042f891b

あと、Googleは、Bot対策しているので、難易度高いし、API使えよですよ。

追記。
JSのことまで考えると、Headless Chromeを使うが一番いいな。
https://qiita.com/mifumi323/items/296d449c5808f04f98c4

WebBrowserは、中身がIEなんでな・・
https://forest.watch.impress.co.jp/docs/news/1121672.html

投稿2018/08/29 08:37

編集2018/08/29 10:11
kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

大変申し訳ありません。
ウイルスバスターのESETがアクセスをブロックしていました。
「ネットワーク保護」の「トラブルシューティングウィザード」というところで「ブロックされたアプリケーションまたはデバイス」から「ブロック解除」を押すことで解決しました。
本当に初歩的なミスです。すみません。
これで、Youtubeの字幕ファイルはダウンロードできました。
回答をくれたalgさん、SurferOnWwwさん、kiichi54321さんありがとうございます。
ちなみに、Youtubeの字幕ファイルはダウンロードできたのですが、BingやGoogleにアクセスはできないことを確認しました。将来、Googleにアクセスする必要があったら、SuferOnWwwさんとkiichi54321さんの回答を参考にしたいと思っています。ありがとうございました。

投稿2018/09/01 01:02

skytomo

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

TLSのバージョンじゃないでしょうか。
System.Net.WebClient はデフォルトでSSL3.0とTLS1.0を使うはずですが、このあたりは2018年現在では無効化されているサイトが多いと思われます。
System.Net.WebClient wc = new System.Net.WebClient(); の前に ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; と入れて、TLS1.2を使うことを明示してみたら、どうなりますか?

csharp

1using System.IO; 2using System.Net; 3using System.Windows.Forms; 4using System.Xml; 5 6namespace YoutubeSubtitlesProject 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 14 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // これを追加 15 System.Net.WebClient wc = new System.Net.WebClient(); 16 wc.DownloadString("https://www.google.co.jp/"); // ここで例外になるかどうか? 17 wc.Dispose(); 18 19 } 20 } 21}

(追記)
.NET 4.5 から、既定値が TLS1.0,TLS1.1,TLS1.2 に変わったようです。

https://blogs.technet.microsoft.com/jpieblog/2015/04/07/net-framework-tls1-1-1-2/

(2017/7/20 追記)
以下の公開情報にありますように、本セキュリティ アドバイザリに記載の更新プログラムを適用することで、.NET Framework 4.5 環境において SecurityProtocol プロパティの既定値が SSL 3.0 および TLS 1.0 から、TLS 1.0、TLS 1.1 および TLS 1.2 へ変更されます。

なので、この回答は外しているかも知れません。

投稿2018/08/29 10:25

編集2018/08/29 10:57
alg

総合スコア2019

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問