質問編集履歴

1 コードを追加しました

takumiURIRIN

takumiURIRIN score 6

2017/07/09 22:29  投稿

Seleniumでスクレイピングする際にタイムアウトしてしまう
Selenium/Pythonでスクレイピングする際にタイムアウトして処理が止まってしまう
###実現したいこと: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 driver.set_script_timeout(10)
    12
    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)
```
###コード
こちらのサイトを元にコードは書きました。
http://qiita.com/kinpira/items/383b0fbee6bf229ea03d
```Python
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()
```
  • Python

    16126 questions

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

  • selenium

    982 questions

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

  • スクレイピング

    694 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る