Selenium Web Scraping Id отсутствует - PullRequest
       33

Selenium Web Scraping Id отсутствует

0 голосов
/ 21 сентября 2018

Я пытаюсь собрать данные с сайта http://maharain.gov.in/.Я написал приведенный ниже скрипт.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re
import csv,sys,os
from bs4 import BeautifulSoup
import time 




def check_exists_by_xpath(xpath,driver):
    try:
        driver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True


chromepath= '/home/swapnil/Downloads/chromedriver'

driver = webdriver.Chrome(chromepath)

start_time =time.time() 
base_url = "http://maharain.gov.in/"
driver.get(base_url)
driver.switch_to.frame('MenuFrame')
driver.find_element_by_name("QueriesCirclewise3").click()
time.sleep(3)
print("Done")
driver.find_element(By.XPATH, '//*[@id="menu"]/input[10]').click()
time.sleep(3)
print("Done")
# driver.find_element_by_name("PastQueriesCirclewise6").click()
time.sleep(3)
print("Done")
# driver.implicitly_wait(3)
driver.switch_to.default_content()
time.sleep(3)
print("Done")
driver.switch_to.frame(driver.find_element_by_name("ContentFrame"))


# dropdown_menu_year = Select(driver.find_element_by_id("selyear")) 
# select_year = [option.text for option in dropdown_menu_year.options]
# select_year = [t for t in select_year if t !='Select']
# select_year = [ '2015', '2016', '2017']

time.sleep(3)
print("Done All ")
dropdown_menu_state = Select(driver.find_element_by_id("selstate")) 
select_state = [option.text for option in dropdown_menu_state.options]
select_state = [t for t in select_state if t !='Select']

dropdown_menu_dist = Select(driver.find_element_by_id("seldist"))   
select_dist = [option.text for option in dropdown_menu_dist.options]
select_dist = [t for t in select_dist if t !='Select']

dropdown_menu_month = Select(driver.find_element_by_id("selmonth"))
select_mon = [option.text for option in dropdown_menu_month.options]
select_mon = [t for t in select_mon if t !='Select']

i = 0
year=str(2018)
# for year in select_year:
if not os.path.exists(year):
    os.makedirs(year)
for state in select_state:
    for dist in select_dist:
        if not os.path.exists(year+'/'+dist):
            os.makedirs(year+'/'+dist)
        for month in select_mon:
            print (i)
            # dropdown_menu_year = Select(driver.find_element_by_id("selyear")) 
            # dropdown_menu_year.select_by_visible_text(year)
            dropdown_menu_state = Select(driver.find_element_by_id("selstate")) 
            dropdown_menu_state.select_by_visible_text(state)
            time.sleep(1)
            dropdown_menu_dist = Select(driver.find_element_by_id("seldist"))   
            dropdown_menu_dist.select_by_visible_text(dist)
            if(dist=='Wardha' or dist=='Washim' or dist=='Yavatmal'):
                # time.sleep(2)
                dropdown_menu_month = Select(driver.find_element_by_id("selmonth"))
                dropdown_menu_month.select_by_visible_text(month)
                time.sleep(2)
                driver.find_element_by_name("btnshow").click()

                time.sleep(2)
                print("Done")
                driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR, 'body > embed'))
                if (check_exists_by_xpath('//*[@id="tableID"]',driver)):
                    tab = driver.find_element(By.XPATH,'//*[@id="tableID"]')
                    soup = BeautifulSoup (driver.page_source)
                    table = soup.select_one('table')
                    data = [[td.text for td in row.find_all("td")] for row in table.find_all("tr")]
                    file_name = year+'/'+dist+'/'+year+'_'+dist+'_'+month+'.csv'
                    print(file_name)
                    f = open(file_name,'w', newline='')
                    writer =csv.writer(f)
                    writer.writerows(data)
                    f.close()
                    i+=1
            driver.switch_to.default_content()
            driver.switch_to.frame(driver.find_element_by_name("ContentFrame"))

print ( time.time() - start_time)
print(i)

Но каждый раз, когда я запускаю код, он застревает в разных местах с ошибками, такими как отсутствие идентификатора селектора "selstate" или "body> embed" отсутствует, что может привести к запускуправильно при следующем запуске без каких-либо изменений в коде и может застрять в другом месте.

Я попытался добавить неявное ожидание драйвера и ожидание потока со значением, установленным на 5 и меньше. Укажите, что должно бытьправильная мера, чтобы запустить его за один раз, и где должны быть добавлены операторы ожидания или ожидания или любые другие изменения, если требуется.

...