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

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

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

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

Python

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

HTML

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

Q&A

解決済

2回答

3300閲覧

python スクレイピング BeautifulSoupのsoup.selectでid指定 とURLにひらがなが入る場合

pethagoras

総合スコア13

スクレイピング

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

Python

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

HTML

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

0グッド

0クリップ

投稿2018/07/21 14:39

前提・実現したいこと

pythonのスクレイピングを勉強中です。
適当なサイトのリンクや文字列を抽出しながら勉強しています。

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

youtubeの動画のリンクを抽出しようとした所

  1. <a>タグのidを上手く指定できずに困っています。
    soup.select("a") だとちゃんと抽出してくれるのですが,idを指定して
    soup.select("a#video-title")やクラスを指定しての
    soup.select("a.yt-simple-endpoint style-scope ytd-video-renderer")だと何もかえってきません
    エラーが出る事なく処理は終了します。

.

  1. URLにひらがなが入るとurlopen()の所でエラーが出てしまいます。

  
以下エラーコード
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\Scripts\sc3.py", line 19, in <module>
html = req.urlopen(url)
File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 526, in open
response = self._open(req, data)
File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 544, in _open
'_open', req)
File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 1361, in https_open
context=self._context, check_hostname=self._check_hostname)
File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 1318, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1250, in _send_request
self.putrequest(method, url, **skips)
File "C:\ProgramData\Anaconda3\lib\http\client.py", line 1117, in putrequest
self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 26-27: ordinal not in range(128)

該当のソースコード

python

1from selenium import webdriver 2import urllib.request as req 3from bs4 import BeautifulSoup 4 5driver = webdriver.Chrome("C:\ProgramData\Anaconda3\chromedriver") 6 7driver.get("https://www.youtube.com/") 8 9textbox = driver.find_element_by_id("search") 10btn = driver.find_element_by_id("search-icon-legacy") 11 12keyword = "dyson" #←ここがひらがなになるとエラーになります。 13 14textbox.send_keys(keyword) 15btn.click() 16 17url = "https://www.youtube.com/results?search_query="+keyword 18html = req.urlopen(url) 19 20soup = BeautifulSoup(html,"html.parser") 21 22date = soup.select("a#video-title") 23 24for a in date: 25 b = a.string 26 c = a.attrs["href"] 27 28 print(b,"リンク→",c) 29

上記内容の対処法、ご教授下さい。
ご解答よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Youtube利用規約よってスクレイピングを禁止しています。

  1. 本サービスの一般的な利用--許可及び制限事項

C,お客様は、本サービス自体の動画再生ページ、Embeddable Player、又はその他YouTubeが明示的に認めた手段以外のあらゆる技術及び手段を通じて、 本コンテンツにアクセスしないことに合意します。

H,お客様は、人間が、標準的なオンライン・ウェブ・ブラウザを使用して、一定の時間内に合理的に生成しうるリクエスト・メッセージよりも多くのリクエスト・メッセージを同程度の時間内にYouTubeサーバに送信するような方法で、本サービスにアクセスする自動システム(「ロボット」、「スパイダー」又は「オフラインリーダー」を含みますが、これらに限られません。)を使用又は起動しないことに合意します。

代わりにYoutube Data APIを使用してくださいな。

投稿2018/07/21 15:28

umyu

総合スコア5846

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

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

pethagoras

2018/07/23 13:09

ご解答ありがとうございます。 なるほど、そもそも禁止だったんですね ご解答ありがとうございました。
guest

0

soup.select("a") だとちゃんと抽出してくれるのですが,idを指定して
soup.select("a#video-title")やクラスを指定しての
soup.select("a.yt-simple-endpoint style-scope ytd-video-renderer")だと何もかえってきません

指定の仕方はあっています。だけど、そのIDやclassがHTML上に存在しないから取得できないだけです。

url = "https://www.youtube.com/results?search_query="+keyword html = req.urlopen(url)

req.urlopenを使って、HTMLを取得してるからそのようにになるのだと思います。つまりこのスクリプトを実行してChromeが立ち上がって検索画面が表示されますが、それとは別にreq.urlopenを使って、HTTPリクエストをなげてHTMLを取得してる ので、画面で表示されてるHTMLと、実際にプログラムがBeatufiulSoupで解析してるHTMLが別ものだから、みつからないのだと思います。

URLにひらがなが入るとurlopen()の所でエラーが出てしまいます。

日本語のパラメータをURLエンコードしてあげてください。

https://qiita.com/mix/items/87d094414e46f857de45

投稿2018/07/21 15:08

tell_k

総合スコア2120

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

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

pethagoras

2018/07/23 13:08

ご解答ありがとうございます。 貼っていただいたリンク先参照させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問