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

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

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

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

2090閲覧

JavaScriptが埋め込まれたリンク先のデータをPythonでダウンロードしたい

nekonyangon

総合スコア14

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2019/02/06 00:45

#前提・実現したいこと

行政がウェブサイトで公開しているデータを自動でダウンロードしてくるクローラーを作成しています。

ダウンロードボタンのhtmlソースは以下のようになっており、javascriptが埋め込まれているようです。

html

1<a href="javascript:*****_download('*****.zip')">ダウンロード</a>

市販の技術書などを参考に以下のようなコードを作成したのですが、エラーになってしまいます。

クローラー・スクレイピングは初心者でして、解決策がわからず、ご教示いただけますと幸いです。

python

1# ライブラリをインポート 2import requests 3from bs4 import BeautifulSoup 4import time 5from selenium import webdriver 6 7# 対象のURL 8url = "https://**********.html" 9EXTENTION = u".zip" 10 11# URLの情報を取得 12r = requests.get(url) 13soup = BeautifulSoup(r.content, "lxml") 14links = soup.findAll('a') # リンク先(aタグ)を抽出 15download_urls = [] 16 17# URLの抽出 18for link in links: 19 href = link.get('href') 20 if href and EXTENTION in href: # hrefの中に"zip"が含まれる場合 21 download_urls.append(href) 22 23# ファイルのダウンロード 24for download_url in download_urls[:3]: 25 # 一秒スリープ 26 time.sleep(1) 27 28 file_name = download_url.split(":")[-1] 29 req = browser.execute_script(download_url) 30 31 # ファイルの保存 32 if req.status_code == 200: 33 f = open(file_name, 'w') 34 f.write(req.content) 35 f.close()

#エラーメッセージ

$ python downloader.py /anaconda3/lib/python3.6/site-packages/bs4/__init__.py:181: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. The code that caused this warning is on line 13 of the file downloader.py. To get rid of this warning, change code that looks like this: BeautifulSoup(YOUR_MARKUP}) to this: BeautifulSoup(YOUR_MARKUP, "lxml") markup_type=markup_type)) Traceback (most recent call last): File "downloader.py", line 30, in <module> req = requests.get(download_url) File "/anaconda3/lib/python3.6/site-packages/requests/api.py", line 72, in get return request('get', url, params=params, **kwargs) File "/anaconda3/lib/python3.6/site-packages/requests/api.py", line 58, in request return session.request(method=method, url=url, **kwargs) File "/anaconda3/lib/python3.6/site-packages/requests/sessions.py", line 508, in request resp = self.send(prep, **send_kwargs) File "/anaconda3/lib/python3.6/site-packages/requests/sessions.py", line 612, in send adapter = self.get_adapter(url=request.url) File "/anaconda3/lib/python3.6/site-packages/requests/sessions.py", line 703, in get_adapter raise InvalidSchema("No connection adapters were found for '%s'" % url) requests.exceptions.InvalidSchema: No connection adapters were found for 'javascript:*****_download('*****.zip')'

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

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

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

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

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

guest

回答1

0

ベストアンサー

<a href="javascript:*****_download('*****.zip')">ダウンロード</a>というHTMLコードは
*****_download('*****.zip')というjavascriptコードを実行するように指示してます。

一方、ソースコードではrequestsに対してjavascript:というURIスキームで動作させようとしていますが、当然requestsはこのスキームに対する動作は対応していないので提示エラーが発生しています。

対処方法としては、*****_download関数の中身を調査して、(もしあれば)ダウンロード先の実URLを探し出すか、seleniumなどでクリック動作させるしかないと思います。

投稿2019/02/06 01:02

can110

総合スコア38234

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問