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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

717閲覧

[Python]NYダウのデータの過去データを、スクレイピングで取り込みたい

minomushia

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/11 06:02

NYダウのデータの過去データを、スクレイピングで取り込みたい

対象のURL
https://finance.yahoo.com/quote/%5EDJI/history?p=%5EDJI

■■対象のURLのOpen、High、Low、Close、Volumeの値を、当日から過去までスクレイピングでCSVに出力したいのですが、
デベロッパーツールに表示されているコードを指定しても、値がうまく指定できません。

■■Yahooニュースなどは思った通りに書き出せるのですが、対象のサイトはどうやってクラスとIDを指定すればいいのかわかりません
(記載はないのですが、もしかしてスクレイピング防止のためでしょうか?)

■■下記、デベロッパーツールに表示されているもので、自分が指定したクラス
Yahooニュース等のソースコードにはなかったのですが、タグに「%」や「px」が入っています。
こういったソースコードの場合、何か特別な処理が必要なのでしょうか?

例)

<div class="Pb(10px) Ovx(a) W(100%)" data-reactid="32"> <span data-reactid="55">34,757.57</span> など

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

何日も調べて何日もハマってます。。どなたか教えてください。

AttributeError: 'NoneType' object has no attribute 'find_all' または None と出力される

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3 4try: 5 load_url = "https://finance.yahoo.com/quote/%5EDJI/history?p=%5EDJI" 6 html = requests.get(load_url) 7 soup = BeautifulSoup(html.content, "html.parser") 8except: 9 print("ページが見つかりません") 10 11topic = soup.find(class_="Pb(10px) Ovx(a) W(100%)") 12for element in topic.find_all("span"): 13 print(element.text) 14

補足情報(FW/ツールのバージョンなど)

Jupyter Notebook

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを実行してみたところ、どうやらHTMLが取得できていないようです。次のコードを、requests.getした後の行に追記して値を確認してみてください。404と出力されると思います。

python

1print(html.status_code)

何でこうなるのか、僕も気になったので調べてみました。そうしたら、同じような問題に引っかかってStackOverflowで質問している方がいました。

https://stackoverflow.com/questions/47506092/python-requests-get-always-get-404

この記事によると、requestsはデフォルトでいくつかリクエストヘッダをセットするみたいです。そしてその中にはUser-Agentも含まれています。
どうやら、サービスの提供者(今回の場合はYahoo)はrequestsが付与するユーザエージェントをブラックリストに登録していて、そのユーザエージェントからのリクエストを一律禁止しているから404が返却されるというのが真相のようです。

一応、当該Stackoverflowの方にも解決方法は載っており、ユーザエージェントを明示的に指定すればブラックリスト候補から外れるのでHTMLを取得できるようになります。実際やってみたら取得することはできました。

ただ、Stackoverflowの回答者の方も述べられていますが、requestsのアクセスを禁じているということは、おそらくサイトの利用規約でスクレイピングが禁止されているのではないかと思います。なので、残念ですが当該HPのスクレイピングはやめておいたほうがいいと私は思います。

余談ですが、検証がてらrequestsが実際にどんなリクエストヘッダを付与してリクエストしているのか、適当なWebサーバを立ててリクエストヘッダを確認してみました。下がその結果です。この通り、python-requests/2.26.0というのが入っていますね。ちなみに、2.26.0はライブラリのバージョンのようです。おそらく、python-requestsとか、その辺りが含まれているユーザエージェントをアクセス禁止にしているのではないでしょうか?

{ host: 'localhost:3001', 'user-agent': 'python-requests/2.26.0', 'accept-encoding': 'gzip, deflate', accept: '*/*', connection: 'keep-alive' }

投稿2021/10/12 17:17

ukyoda

総合スコア386

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問