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

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

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

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

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

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

selenium

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

Q&A

解決済

2回答

1512閲覧

seleniumで無限スクロールページをスクレイピングする際に動作が重くなってくる

banao

総合スコア13

スクレイピング

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

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python 3.x

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

selenium

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

0グッド

1クリップ

投稿2019/10/30 15:57

編集2019/10/30 16:17

無限スクロールページをスクレイピングしているのですが、途中で動作が重くなってしまいます。
以下が動かしているコードの一部です。
python初心者なため、稚拙な記述の仕方かもしれませんがご容赦くださいm(__)m

python

1from selenium.webdriver import Chrome, ChromeOptions, Remote 2from selenium.webdriver.common.by import By 3from selenium.webdriver.support import expected_conditions as EC 4from selenium.webdriver.support.ui import WebDriverWait 5from selenium.common.exceptions import NoSuchElementException 6from selenium.webdriver.common.by import By 7import time 8import re 9import sys 10import json 11import datetime 12 13# 諸情報 14login_ID = '******' 15login_pass = '******' 16chromedriver_path = 'C:/Users/******/chromedriver/chromedriver.exe' 17access_url = '******' 18 19# メイン処理 20def main(): 21 options = ChromeOptions() 22 options.add_argument('--headless') # ヘッドレス起動時のみ 23 driver = Chrome(executable_path=chromedriver_path,options=options) 24 navigate(driver) # 目標箇所に遷移 25 time.sleep(2) 26 contents = scrape_contents(driver) # 内容をスクレイピング 27 28# スクレイピング箇所まで移動 29def navigate(driver): 30 driver.get(access_url) 31 input_element = driver.find_element_by_name('tid') 32 input_element.send_keys(login_ID) 33 input_element = driver.find_element_by_name('tpasswd') 34 input_element.send_keys(login_pass) 35 driver.find_element_by_class_name('MdBtn01').click() 36 time.sleep(2) 37 driver.find_element_by_class_name('MdBtn01').click() 38 time.sleep(2) 39 40# スクレイピング 41def scrape_contents(driver): 42 contents = [] 43 n = 1 44 limit = 3000 45 while n <= limit: 46 article = driver.find_elements_by_css_selector(f'div.container > section > article:nth-of-type({n})') 47 try: article = article[0] 48 except: break 49 try: 50 post_time = article.find_element_by_css_selector('dd.time > a').text 51 post_text = article.find_element_by_css_selector('div.article_contents > p.type_text').text 52 post_comment = [] 53 for c in article.find_elements_by_css_selector('dd.comment > p > span'): 54 post_comment.append(c.text) 55 post_pic_style = [] 56 post_pic = [] 57 for p in article.find_elements_by_css_selector('div.article_contents > div > div > span > a > span[style]'): 58 post_pic_style.append(p) 59 for b in post_pic_style: 60 b = b.value_of_css_property('background-image') 61 b = re.findall('"(.*)"',b) 62 b = ','.join(b) 63 post_pic.append(b) 64 except NoSuchElementException: 65 post_time = '' 66 post_text = '' 67 post_comment = '' 68 post_pic = '' 69 contents.append({ 70 "time": post_time, 71 "text": post_text, 72 "comment": post_comment, 73 "pic": post_pic, 74 }) 75 if n % 10 == 0: 76 try: 77 driver.execute_script('scroll(0, document.body.scrollHeight)') 78 wait = WebDriverWait(driver, 100) 79 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, f'div.container > section > article:nth-of-type({n+1})'))) 80 except: 81 break 82 sys.stdout.write("\r投稿情報取得数:%d" % n) 83 sys.stdout.flush() 84 n = n + 1 85 return contents 86 87# 実行 88if __name__ == '__main__': 89 main()

自動操作でアクセスしたページで投稿(article)の投稿日時、内容、画像URL、返信コメントをスクレイピングしています。articleの要素は最初は10個あり、下までスクロールすると新たに10個読み込まれます。
limitでスクレイピングする投稿数を指定しています。
上のコードの場合は3000回ループさせていますが、2000回あたりで動作の重さが顕著になっていき、3000当たりではほぼ止まってタイムアウトすることもあります。
原因はchromeで読み込んでいるページが大きくなりすぎているからでしょうか?また、10000回ほどループさせたいのですが、どうすればタイムアウト(100秒まで)せずに処理できるでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/10/30 22:29 編集

1. 動作が重くなっている時の画面の状態は確認されていますか? 2. スクロールするたびにページの要素数が増加していることを確認されていますか? 現行の # スクレイピング はタイムアウトの指定のみで300回ページにアクセスしているように見えます。 短期間に高頻度でアクセスすると反応が悪くなることもあるのでは?
guest

回答2

0

ある程度重くなることをある処理ができるようになるまでの時間で測っていいのならwebdriverwaitをつかうといいと思います。
参考

投稿2019/10/31 09:54

shirai

総合スコア1289

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

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

0

ベストアンサー

原因はchromeで読み込んでいるページが大きくなりすぎているからでしょうか?

そうでしょうね。手動でも同様ではないでしょうか。
Chromeの使用メモリが膨らんでいると思うので、確認してみてください。

どうすればタイムアウト(100秒まで)せずに処理できるでしょうか?

タイムアウト時間を延ばして解決するなら良いのですが、それにしても無限にメモリを使わせるのは無理なので、自動スクロールをしないで全件を取得する手段がないか、画面やHTMLやJavaScript等を調べるのでしょうか。

投稿2019/10/31 02:11

otn

総合スコア84423

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

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

banao

2019/11/08 03:23

フワフワした質問で申し訳ありませんでした。やはりChromeのメモリが膨らみすぎているようです。タイムアウトを伸ばす手段以外を探してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問