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

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

ただいまの
回答率

88.92%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,187

skytomo

score 30

 前提・実現したいこと

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

using System.IO;
using System.Net;
using System.Windows.Forms;
using System.Xml;

namespace YoutubeSubtitlesProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            System.Net.WebClient wc = new System.Net.WebClient();
            wc.DownloadString("https://www.google.co.jp/"); // ここで例外
            wc.Dispose();

        }
    }
}

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

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ファイルはちゃんと表示されます。

using System;
using System.Windows.Forms;

namespace WebBrowserProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            webBrowser1.Navigate(@"https://teratail.com/questions/30410");

            Console.WriteLine(webBrowser1.DocumentText);
        }
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/08/29 17:15

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

    キャンセル

  • m.ts10806

    2018/08/29 17:34

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

    キャンセル

回答 4

+1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

using System.IO;
using System.Net;
using System.Windows.Forms;
using System.Xml;

namespace YoutubeSubtitlesProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // これを追加
            System.Net.WebClient wc = new System.Net.WebClient();
            wc.DownloadString("https://www.google.co.jp/"); // ここで例外になるかどうか?
            wc.Dispose();

        }
    }
}

(追記)
.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 へ変更されます。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る