如何防止我的Selenium / Python程序崩溃?

时间:2017-01-31 06:19:09

标签: python selenium web-scraping automation scrapy

我制作了一个程序,从Google Sheet流程中获取一条记录,然后将其删除,依此类推。如果我更新Google表格,那么程序将在下一个循环中扣除记录并对其进行处理,然后删除, 但它只运行1或2小时,然后程序出错:

enter image description here

我可以在程序中添加什么,以便我的程序永不停止?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import traceback
import string
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from selenium.common.exceptions import NoAlertPresentException
from selenium.common.exceptions import UnexpectedAlertPresentException


Email=raw_input('Please Enter your Email:  ')
password=raw_input('Please Enter Password:  ')


print("\n******Don't Interrupt the Script******")
print('#script is Runing............\n')



chrome_options = webdriver.ChromeOptions() #going to chrome options
chrome_options.add_argument("--start-maximized")
prefs = {"profile.default_content_setting_values.notifications" : 2 #turn off all notifications
         ,"profile.managed_default_content_settings.images": 2} #disable images 
chrome_options.add_experimental_option("prefs",prefs)
driver = webdriver.Chrome(chrome_options=chrome_options) # passing paramaters to chrome

driver.get('https://accounts.google.com')
time.sleep(3)

#giving Email-------------------
email = driver.find_element_by_id('Email')
email.send_keys(Email, Keys.RETURN)

#giving password----------------
time.sleep(3)
email = driver.find_element_by_id('Passwd')
email.send_keys(password, Keys.RETURN)


#credentials + attach with googleSheet------------------------------ 
scope = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('stephens-31d8490b5bd2.json', scope)
google_sheet = gspread.authorize(credentials)
workSheet = google_sheet.open("Video Access Master Sheet").worksheet("Sheet1")



while True:
    #fetch Records from Rows 2 to 50 and save on list-----------------
    for i in range(2,51): 
        li_url=[]
        li_email=[]
        row=workSheet.row_values(i)
        for b in row:
            if 'youtu' in b:
                li_url.append(b)

                #find record which you append on list and then delete from googleSheet--------------------
                cell = workSheet.find(b)
                row = cell.row
                col = cell.col
                workSheet.update_cell(row,col, '')
                print 'Fetching Values From Row '+str(i)+'....'
            elif '@' in b:
                li_email.append(b)
            elif b=='':
                continue
            else:
                continue

        #*********************************************************
        #getting length list of li_url and apply condition on it-----------------------------------------------
        length=len(li_url)
        if length==0:
            continue
        else:
            try:
                #getting URLs from list and put into driver.get---------------------------------------------------------
                for a in li_url:
                    driver.get(a)
                    time.sleep(3)
                    driver.find_element_by_css_selector('.yt-uix-button-icon.yt-uix-button-icon-info.yt-sprite').click()
                    time.sleep(3)
                    driver.find_element_by_css_selector('.yt-uix-button.yt-uix-button-size-default.yt-uix-button-default.metadata-share-button').click()
                    time.sleep(2)
                    put_email=driver.find_element_by_css_selector('.yt-uix-form-input-textarea.metadata-share-contacts')

                    #getting emails from email list--------------------------------------------------------------
                    put_email.send_keys(li_email[0])
                    time.sleep(2)
                    driver.find_element_by_css_selector('.yt-uix-button.yt-uix-button-size-default.yt-uix-button-primary.sharing-dialog-button.sharing-dialog-ok').click()
                    time.sleep(4)
                    driver.find_element_by_xpath('.//*[@id="video-header"]/div/button[2]/span').click()
                    time.sleep(10)

                #for notifications and alters--------------------------------------------   
                try:
                    driver.switch_to.alert.accept()
                except NoAlertPresentException:
                    pass
                except UnexpectedAlertPresentException:
                    pass
            except:
                traceback.print_exc
                pass

        print 'Row '+str(i)+' Successfully Updated. \n'
    time.sleep(120) #while loop sleep for 20minuts

这是我得到的错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<string>", line 56, in parse
  File "<string>", line 35, in parse
cElementTree.ParseError: no element found: line 1, column 0

1 个答案:

答案 0 :(得分:0)

由于某种原因cell = workSheet.find(b)失败。可能是那里的坏数据;没有看到输入,这是任何人的猜测。

由于您已经知道了行号,因此您可以通过简单地跟踪您正在搜索的列并在复制数据后最终调用cell = workSheet.find(b)来避免使用workSheet.update_cell(i, col, '')