2017-07-13 41 views
0

python selenium webドライバを使用してWebスクラップスクリプトを作成しましたが、問題はデータが大きすぎるためインターネット接続が数秒間中断されたときにスクリプトの実行が再開します私は最初から始める必要があります。 他のいくつかのソリューションを私を助けたり、私を導いてくださいscrapyフレームワークを使用してインターネット接続が中断された場合、Webスクレイピングスクリプトが停止する

ワーキングコード:それは要素を見つけたときに暗黙のうちにタイムアウトを設定していない場合

import time 
from bs4 import BeautifulSoup 
from selenium import webdriver 
import MySQLdb 

# Open database connection 
db = MySQLdb.connect(host="localhost", # your host, usually localhost 
        user="root", # your username 
        passwd="", # your password 
        db="test") # name of the data base 

url = "http://xlnindia.gov.in/frm_G_Cold_S_Query.aspx" 
browser = webdriver.Chrome() 
browser.get(url) 

time.sleep(5) 
html = browser.page_source 
soup = BeautifulSoup(html, "lxml") 

states = [ x["value"] for x in soup.find("td", bgcolor="#ffe0c0").find_all("option") ] 

for state in states: 

    cur_state = browser.find_element_by_id("ddldistrict") 
    cur_state.send_keys(state) 

    html = browser.page_source 
    soup = BeautifulSoup(html, "lxml") 

    districts = [ x["value"] for x in soup.find("td", bgcolor="#ffe0c0").find_next_sibling().find_all("option") ] 
    districts = districts[1:] 

    for dist in districts: 

     district = browser.find_element_by_id("ddldistrict") 
     district.send_keys(dist) 

     html = browser.page_source 
     soup = BeautifulSoup(html, "lxml") 

     talukas = [ x["value"] for x in soup.find("td", bgcolor="#ffe0c0").find_next_sibling().find_all("option") ] 
     talukas = talukas[1:] 

     for taluka in talukas: 

      category = browser.find_element_by_id("ddltaluka") 
      category.send_keys(taluka) 

      button = browser.find_element_by_id("btnSearch") 
      button.click() 

      time.sleep(10) 
      browser.save_screenshot(browser.title + ".JPEG") 
      html = browser.page_source 
      soup = BeautifulSoup(html, "html.parser") 
      table = soup.find(id="dgDisplay") 
      if table: 
       #print("found") 
       cursor=db.cursor() 
       for row in table.findAll("tr")[1:]: 
        cells = row.findAll("td") 
        name = cells[0].find(text=True) 
        city = cells[1].find(text=True) 
        licence = cells[2].find(text=True) 
        owner = cells[3].find(text=True) 
        print("Name:"+name+"city:"+city+"licence:"+licence+"owner:"+owner) 
        try: 
         cursor.execute ("INSERT INTO distributors (name, city, licence, owner) VALUES (%s, %s, %s, %s);", (name, city, licence, owner)) 
        except (MySQLdb.Error, MySQLdb.Warning) as e: 
         print(e) 
       db.commit()   
      #else: 
      # print("not found") 
db.close()     
browser.close() 
browser.quit() 
+0

正確な例外の例として、スタックトレースがあります。これは非常に役に立ちます。 –

答えて

-2

通常、ドライバーはすぐに例外をスローします。したがって、ページがゆっくりとロードされている場合でも、この方法で処理され、また、要素が中断された場合でも待機します。ブラウザを起動してから次のタイムアウトを追加して試してみてください。

driver.implicitly_wait(30); 
+0

そして、forループの先頭に別のtry/exceptブロックを挿入して、TimeoutExceptionsをキャッチします。これにより、プログラムが終了しなくなります。おそらくブロックの例外部分の中で適切な休止の後に再試行をスケジュールするでしょう。 –

関連する問題