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

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

ただいまの
回答率

90.12%

Selenium/Pythonでスクレイピングする際にタイムアウトして処理が止まってしまう

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,629

takumiURIRIN

score 6

実現したいこと:Selenium/PythonでWEBサイトをスクレイピングしたい

Selenium/Pythonを用いてWEBサイトのスクレイピングを行っています。
スクレイピング自体は問題なくできているのですが、スクレイピングするページ数が多く途中で停止してしまいます。

最後までスクレイピングを行えるようにしたいです。

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

---------------------------------------------------------------------------
TimeoutException                          Traceback (most recent call last)
<ipython-input-11-66fb62304bd9> in <module>()
      8 driver = webdriver.Chrome()
      9 link = 'example.com'
---> 10 driver.get(link)
     11 

~/.pyenv/versions/3.6.0/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in get(self, url)
    266         Loads a web page in the current browser session.
    267         """
--> 268         self.execute(Command.GET, {'url': url})
    269 
    270     @property

~/.pyenv/versions/3.6.0/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
    254         response = self.command_executor.execute(driver_command, params)
    255         if response:
--> 256             self.error_handler.check_response(response)
    257             response['value'] = self._unwrap_value(
    258                 response.get('value', None))

~/.pyenv/versions/3.6.0/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
    192         elif exception_class == UnexpectedAlertPresentException and 'alert' in value:
    193             raise exception_class(message, screen, stacktrace, value['alert'].get('text'))
--> 194         raise exception_class(message, screen, stacktrace)
    195 
    196     def _value_or_default(self, obj, key, default):

TimeoutException: Message: timeout
  (Session info: chrome=59.0.3071.115)
  (Driver info: chromedriver=2.30.477690 (c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.12.4 x86_64)

コード

from selenium import webdriver
from bs4 import BeautifulSoup
import time
import re
import csv

#Open Chrome, Visit the target page
driver = webdriver.Chrome()
link = 'https://example.com/'
driver.get(link)

#Create array
data_list = []
property_names = []
property_links = []
bed_numbers = []
bath_numbers = []
room_sizes = []
property_prices = []

#Get total number of properties
data = driver.page_source.encode('utf-8')
soup = BeautifulSoup(data,"lxml")
property_number = soup.find("div", class_="class")

#Calculate total pages
page_number = int(int(property_number.text.split(" ")[0]) / 10) + 1
print(page_number)

#File open
f = open('output.csv', 'w')
writer = csv.writer(f, lineterminator='\n', delimiter=';')

for i in range(page_number):
    link_base = 'https://example.com/?page='
    link = link_base + str(i + 1)
    print(link)
    driver.get(link)

    time.sleep(5)

    #Convert source code to lxml
    data = driver.page_source.encode('utf-8')
    soup = BeautifulSoup(data,"lxml")

    for j in range(10):
        property_listing = soup.select("div[data]")

        #Get property name
        property_names.append(property_listing[j].find_all("h2")[0].text)

        #Get property link
        property_links.append(property_listing[j].find_all("a")[0].get("href"))

        #Get bed number, bath number, room size
        string = property_listing[j].select(".listing")[0]
        index = str(string).find("bed")
        if index != -1:
            bed_numbers.append(int(property_listing[j].select(".listing")[0].text.lstrip()))
            index = str(string).find("bath")
            if index != -1:
                bath_numbers.append(int(property_listing[j].select(".listing")[1].text.lstrip()))
                index = str(string).find("sqm")
                if index != -1:
                    room_sizes.append(int(property_listing[j].select(".listing")[2].text.lstrip().split("m")[0]))
                else:
                    room_sizes.append("")
            else:
                bath_numbers.append("")
                index = str(string).find("sqm")
                if index != -1:
                    room_sizes.append(int(property_listing[j].select(".listing")[1].text.lstrip().split("m")[0]))
                else:
                    room_sizes.append("")

        else:
            bed_numbers.append("")
            index = str(string).find("bath")
            if index != -1:
                bath_numbers.append(int(property_listing[j].select(".listing")[0].text.lstrip()))
                index = str(string).find("sqm")
                if index != -1:
                    room_sizes.append(int(property_listing[j].select(".listing")[1].text.lstrip().split("m")[0]))
                else:
                    room_sizes.append("")
            else:
                bath_numbers.append("")
                index = str(string).find("sqm")
                if index != -1:
                    room_sizes.append(int(property_listing[j].select(".listing")[0].text.lstrip().split("m")[0]))
                else:
                    room_sizes.append("")

        #Get property price
        string = property_listing[j]

        index = str(string).find("listing-price")
        if index != -1:
            property_prices.append(str(property_listing[j].select(".listing-price")[0].text.lstrip().split("\n")[0]))
        else:
            property_prices.append("")

    #Wait for JS running
    time.sleep(5)

print(property_names)
print(property_links)
print(bed_numbers)
print(bath_numbers)
print(room_sizes)
print(property_prices)

body = [property_names, property_links, bed_numbers, bath_numbers, room_sizes, property_prices]

# Output
writer.writerows(body)

# Close file
f.close()

driver.quit()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる