2017-09-28 6 views
-2

Je veux extraire un grand nombre de pages d'un site Web d'API, je dois donc attendre pour charger les éléments et après que mon script puisse cliquer dessus. Mais le time.sleep (5) ne fonctionne pas, car il saute instinctivement à la page suivante.Pourquoi ne pas travailler mon code time.sleep (x) en python sur debian?

De quoi ai-je tort?

Mon code:

def scrape(urls): 
    browser = webdriver.Firefox() 
    datatable=[] 
    for url in urls: 
     browser.get(url) 
     time.sleep(5) 
     driver.find_element_by_xpath('//button[contains(text(), "Load earlier flights")]').click() 
     time.sleep(5) 
     html = browser.page_source 
     soup=BeautifulSoup(html,"html.parser") 
     table = soup.find('table', { "class" : "table table-condensed table-hover data-table m-n-t-15" }) 
     soup2=BeautifulSoup(html,"html.parser") 
     name = soup2.h2.string 
     soup3=BeautifulSoup(html,"html.parser") 
     name2 = soup3.h1.string 
     soup4=BeautifulSoup(html,"html.parser") 
     name3 = soup4.h3.string 
     name4 = datetime.now() 

     for record in table.find_all('tr', class_="hidden-xs hidden-sm ng-scope"): 
      temp_data = [] 
      temp_data.append(name4) 
      temp_data.append(name) 
      temp_data.append(name2)  
      temp_data.append(name3)  
      for data in record.find_all("td"): 
       temp_data.append(data.text.encode('latin-1')) 
      newlist = filter(None, temp_data) 
      datatable.append(newlist) 

    time.sleep(10) 
    browser.close() 
    return datatable 

La première URL: flightradar24.com/data/airports/ams/arrivals~~V~~singular~~3rd

+2

pourquoi ne vous créez ** 4 ** soupes ayant le même contenu (indice, vous ne devez pas!) –

+1

En se fondant sur 'time.sleep()' d'attendre une page à complètement chargé est fragile au mieux. Vous voudrez peut-être vérifier s'il y a une meilleure solution dans le sélénium ... –

+0

Je sais qu'il y a une meilleure solution comme les éléments d'attente, etc, mais je suis intéressé par cela pourquoi time.sleep() ne fonctionne pas dans mon code. –

Répondre

0

Ne pas utiliser time.sleep, utilisez les attentes explicites et implicites fournies par selenium.

+0

Et ici dans mon code je dois l'utiliser? "driver = webdriver.Firefox() driver.implicitly_wait (10) driver.get (" url ") myDynamicElement = driver.find_element_by_name (" vol de charge plus tôt ")" ? –

+0

@ Mr.D si vous voulez une attente implicite, oui. Mais vous pouvez optimiser votre code et utiliser une attente explicite. –

0

J'utiliserais les "conditions_compliquées" fournies avec le sélénium.

par exemple.

 from selenium.webdriver.support import expected_conditions as EC 

     Def someFunc(self): 
      self.myDriver = webdriver.Chrome(executable_path="webDrivers\chromedriver.exe") 
      self.waitElement = WebDriverWait(self.myDriver,10) 
      self.waitElement.until(EC.presence_of_all_elements_located((By.CLASS_NAME,'page-link'))) 
      #do something with page 

Ceci attendrait 10 secondes pour tous les noms de classe "page-link" situés par sélénium. Vous pouvez en savoir plus d'informations Here