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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

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

HTML

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

Q&A

解決済

1回答

1794閲覧

JavascriptのWebサイトをスクレイピングしたい

KohnoseLami

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2020/06/05 18:30

編集2020/06/06 04:55

前提・実現したいこと

テキストファイル内のURL一覧を一行ずつ参照しサイトにアクセスして、そのサイト内に設定した文字列が存在する場合にのみにURL一覧をテキストファイル形式で出力したい。

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

スクレイピング対象URLがJavascriptで見事に動作しませんでした。

該当のソースコード

Python3

1import requests 2from time import time 3from threading import Thread 4import sys 5from bs4 import BeautifulSoup 6 7#コマンドライン引数 USAGE: $python check_url.py [input_file] 8args = sys.argv 9if len(args)==2: 10 input_file = args[1] 11else: 12 input_file ="list.txt" #デフォルト 13 14#キーワード設定 15keywords_list=["データが見つかりませんでした"] 16 17#結果を入れるリスト 18logs= [] 19urls_404 = [] 20urls_504 = [] 21urls_accept = [] 22 23def check_url(target_url): 24 25 try: 26 req = requests.get(target_url) 27 logs.append(str(req.status_code)+"\t"+target_url) 28 29 if req.status_code == 404: 30 urls_404.append(target_url) 31 32 elif req.status_code == 504: 33 urls_504.append(target_url) 34 35 elif req.status_code == 200: 36 html = BeautifulSoup(req.text, "html.parser") 37 #print(str(html)) 38 title = html.find("title").text #<title>~</title>の文字列 39 body = html.find("body").text #<body>~</body>の文字列 40 41 for keyword in keywords_list: 42 if keyword in body: # キーワードがbodyに含まれているか判定 43 urls_accept.append(target_url) 44 break 45 46 except requests.exceptions.ConnectTimeout: 47 print('タイムアウトしました') 48 logs.append("TIMEOUT"+"\t"+target_url) 49 50 51start = time() 52 53with open(input_file) as f: 54 urls = f.read().splitlines() 55 56threads = [] 57 58for url in urls: 59 thread = Thread(target=check_url, args=(url,)) 60 thread.start() 61 threads.append(thread) 62 63for thread in threads: 64 thread.join() 65 66print("\n".join(logs)) 67 68with open("log.txt", "w") as f: 69 f.write("\n".join(logs)) 70 71with open("404.txt", "w") as f: 72 f.write("\n".join(urls_404)) 73 74with open("504.txt", "w") as f: 75 f.write("\n".join(urls_504)) 76 77with open("output.txt", "w") as f: 78 f.write("\n".join(urls_accept)) 79 80print(time() - start) 81

試したこと

Javascriptでのスクレイピングで少し調べたのですがSeleniumでのスクレイピングで実際のブラウザを使用する方法が出てきたのですがこれでは結果が出るまでにかなり遅そうでなおかつとても動作が重そうでしたのでまだ何も試せていない状況です。
調べるURLの総数がかなり多いため速度を重視させたいです。
もしbs4などの軽い動作でなおかつ速度が出せるものがあれば教えてほしいです。
軽い動作のJavascriptスクレイピングモジュールが見つかっていないため教えていただけると助かります。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

「まだ何も試せていない」と仰る Selenium から試されてはいかがでしょうか。

軽い動作のJavascriptスクレイピングモジュール

JavaScript で動的生成される文書をスクレイピングする場合、
ご質問で 敬遠されている Selenium など(ブラウザ/ヘッドレスモード含む)を利用する 以外にないと言えます。

bs4(beautifulsoup4)やscrapy はマークアップ文書(HTML/XML)のパーサライブラリのようですので、マークアップ文書をテキストとして読み込めるのが前提です。別途、ブラウザ機能(同等のJavaScript実行環境)が必要です。

軽い動作(中略)教えていただけると助かります

JavaScript で動的生成される文書を扱うのであれば、**「ヘッドレスブラウザを比較選定」**するしかないと思います。


スクレイピングには注意が必要な時代(私見)

サーバー応答するHTMLであれば、機械処理(スクレイピング)が想定された応答と言えますが
JavaScriptで動的生成するHTMLには「必ず人の手を介する」という前提の応答とも言えそうです。
(「画面に向かう人の合意を得る(法的根拠を与える)目的」もあると思います)。
JavaScriptで生成される文書の自動処理は、こうした側面にも注意してください(利用規約の十分な確認)。

投稿2020/06/06 08:18

AkitoshiManabe

総合スコア5432

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

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

KohnoseLami

2020/06/06 15:28

丁寧なご回答ありがとうございます! やはり実際にブラウザで実行するしかないのですね... そうですね...Javascriptになっている=人の手動で操作が必要ということですもんね.. ありがとうございます。実際にSelenium等のJavascriptを実行できる環境で試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問