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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

Q&A

解決済

3回答

961閲覧

検索結果のスクレイピングで特定のクラスの情報が取得できない

tasojiro

総合スコア16

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

0グッド

0クリップ

投稿2022/01/08 15:09

前提・実現したいこと

Goolge検索結果のスクレイピングを実装しています。

実現したいことは、映画の英語名を検索した際に「検索した映画の日本語名」と「その画像」を取得することです。

例えば、「Shawshank Redemption, The (1994)」と検索すると、検索結果の右側にその映画の日本語名と画像が複数枚でてくると思いますが、その名前と画像1枚を取得したいと考えています。

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

エラーではなく、次の該当コードを実行するとからのリストが返ってきてしまいます。

該当のソースコード

実行したコードです。
selectしているのはWEBの検証機能で得られたクラスです。

python

1from bs4 import BeautifulSoup 2import requests 3 4def main(key): 5 url = 'https://www.google.com/search?q=' + key 6 result = requests.get(url) 7 soup = BeautifulSoup(result.text, 'html.parser') 8 title = soup.select('div.qrShPb kno-ecr-pt PZPZlf HOpgu mfMhoc') 9 img = soup.select('div.fWhgmd') 10 print(title) 11 print(img) 12 return 0 13 14if __name__ == "__main__": 15 main('Shawshank Redemption, The (1994)')

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

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

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

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

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

guest

回答3

0

ベストアンサー

日本語のタイトルに関しては現状ではクラス名が BNeawe で始まる最初の div 要素から取得できる様です(将来的には変更されるでしょう)。画像の URL に関しては /imgres で始まる href 属性から取得できます(こちらも将来的には変更されるでしょう)。

python

1from bs4 import BeautifulSoup 2import requests 3import re 4import urllib.parse 5 6def main(key): 7 url = 'https://www.google.com/search?q=' + urllib.parse.quote(key) 8 result = requests.get(url) 9 soup = BeautifulSoup(result.text, 'html.parser') 10 # japanese title 11 title = soup.select('div[class^="BNeawe"]') 12 if title: title = title[0].get_text() 13 # image url 14 img = [] 15 for i in soup.select('[href^="/imgres"]'): 16 m = re.search(r'imgurl=(http.+?)&', i.get('href')) 17 if m: img.append(m[1]) 18 # print result 19 print(title) 20 for nth, i in enumerate(img): print(f'{nth+1}: {i}') 21 return 0 22 23if __name__ == "__main__": 24 main('Shawshank Redemption, The (1994)') 25 main('2001: A Space Odyssey') 26 main('Witness, (1985)') 27 28# 29ショーシャンクの空に 301: http://piacinema2.xtwo.jp/contents/google/flyer/114076.jpg 312: https://m.media-amazon.com/images/M/MV5BNjQ2NDA3MDcxMF5BMl5BanBnXkFtZTgwMjE5NTU0NzE@._V1_.jpg 323: https://m.media-amazon.com/images/M/MV5BMDFkYTc0MGEtZmNhMC00ZDIzLWFmNTEtODM1ZmRlYWMwMWFmXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_FMjpg_UX1000_.jpg 334: https://i1.wp.com/100bestmovie.com/wp-content/uploads/2018/07/shawshank_redemption-1994-1.jpg?fit%3D928%252C523%26ssl%3D1 34 352001年宇宙の旅 361: http://piacinema2.xtwo.jp/contents/google/flyer/148122.jpg 372: https://images-na.ssl-images-amazon.com/images/I/913KBjQ6saL.jpg 383: https://m.media-amazon.com/images/M/MV5BMmNlYzRiNDctZWNhMi00MzI4LThkZTctMTUzMmZkMmFmNThmXkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_FMjpg_UX1000_.jpg 394: https://images-na.ssl-images-amazon.com/images/I/717Egt3-z6L.jpg 40 41刑事ジョン・ブック 目撃者 421: https://encrypted-tbn3.gstatic.com/images?q%3Dtbn:ANd9GcSDd9_t1CNAXNLKc3K6_EcDj9bNcYJX3Ltbyxiu_DRKqC8RVoIK 432: http://www.houyhnhnm.jp/blog/moriyama/images/jedi_witness_movie.jpg 443: https://upload.wikimedia.org/wikipedia/en/thumb/b/bc/Witness_movie.jpg/220px-Witness_movie.jpg 454: https://godtv.com/wp-content/uploads/2017/03/witness-poster3.jpg

投稿2022/01/08 16:34

melian

総合スコア19761

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

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

tasojiro

2022/01/09 02:58

回答ありがとうございます。 HTMLの指定がとても勉強になりました。ありがとうございます。
guest

0

Googleの検索結果ページは1枚のHTMLでドカっと表示してるわけではなく、非同期で結果データを別途リクエストしたものをスクリプトで埋めこむようになってます。

Chromeの開発者ツールで見ると、欲しい情報はHTMLじゃなくJSONに入ってるのが確認できます。
イメージ説明

別の質問でも答えたんですが、BeautifulSoupは静的なHTML解析にしか使えず、スクリプトで組み立てる動的なサイトのスクレイピングには使えません。

最近はほとんど動的なサイトばかりだと思うので、別のツールを勉強をオススメします。

投稿2022/01/08 16:14

umau

総合スコア805

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

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

0

JavaScriptで追加した要素でしょう。requestsで得られるのは追加前のHTMLです。

投稿2022/01/08 15:38

otn

総合スコア84538

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問