Selenium raspado con urls múltiples

Siguiendo mi pregunta anterior, ahora estoy tratando de raspar varias páginas de una url (todas las páginas con juegos en una temporada determinada). También estoy tratando de raspar múltiples URLs (estaciones):

from selenium import webdriver import pandas as pd import time url = ['http://www.oddsportal.com/hockey/austria/ebel-2014-2015/results/#/page/', 'http://www.oddsportal.com/hockey/austria/ebel-2013-2014/results/#/page/'] data = [] for i in url: for j in range(1,8): print i+str(j) driver = webdriver.PhantomJS() driver.implicitly_wait(10) driver.get(i+str(j)) for match in driver.find_elements_by_css_selector("div#tournamentTable tr.deactivate"): home, away = match.find_element_by_class_name("table-participant").text.split(" - ") date = match.find_element_by_xpath(".//preceding::th[contains(@class, 'first2')][1]").text if " - " in date: date, event = date.split(" - ") else: event = "Not specified" data.append({ "home": home.strip(), "away": away.strip(), "date": date.strip(), "event": event.strip() }) driver.close() time.sleep(3) print str(j)+" was ok" df = pd.DataFrame(data) print df # ok for six results then socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host # ok for two results, then infinite load # added time.sleep(3) # ok for first result, infinite load after that # added implicitly wait # no result, infinite load 

Al principio probé el código dos veces sin la espera implícita en la línea 14 ni la suspensión en el 35. El primer resultado dio el error de socket. El segundo resultado se detuvo sin error después de dos buenas páginas raspadas.

Luego agregó el tiempo espera como se indicó anteriormente y no han ayudado.

Dado que los resultados no son consistentes, mi conjetura es que la conexión se restablece entre el final del bucle y la próxima ejecución. Me gustaría saber si esa es una solución probable y cómo implementarla. Revisé el archivo robots.txt del sitio y no puedo ver nada que evite el raspado después de un intervalo establecido.

En segundo lugar, digamos que el raspador obtiene el 90% de las páginas, luego se detiene (espera infinita). ¿Hay alguna manera de hacer que vuelva a intentar ese bucle después de x segundos para guardar lo que tienes y volver a intentarlo desde el punto bloqueado?

Lo que necesitas hacer es:

  • reutilizar la misma instancia de webdriver – no inicializarla en el bucle
  • introduce Explicit Waits – esto definitivamente haría que el código sea más confiable y rápido

Implementación:

 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd urls = [ 'http://www.oddsportal.com/hockey/austria/ebel-2014-2015/results/#/page/', 'http://www.oddsportal.com/hockey/austria/ebel-2013-2014/results/#/page/' ] data = [] driver = webdriver.PhantomJS() driver.implicitly_wait(10) wait = WebDriverWait(driver, 10) for url in urls: for page in range(1, 8): driver.get(url + str(page)) # wait for the page to load wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div#tournamentTable tr.deactivate"))) for match in driver.find_elements_by_css_selector("div#tournamentTable tr.deactivate"): home, away = match.find_element_by_class_name("table-participant").text.split(" - ") date = match.find_element_by_xpath(".//preceding::th[contains(@class, 'first2')][1]").text if " - " in date: date, event = date.split(" - ") else: event = "Not specified" data.append({ "home": home.strip(), "away": away.strip(), "date": date.strip(), "event": event.strip() }) driver.close() df = pd.DataFrame(data) print(df) 

Huellas dactilares:

  away date event home 0 Salzburg 14 Apr 2015 Play Offs Vienna Capitals 1 Vienna Capitals 12 Apr 2015 Play Offs Salzburg 2 Salzburg 10 Apr 2015 Play Offs Vienna Capitals 3 Vienna Capitals 07 Apr 2015 Play Offs Salzburg 4 Vienna Capitals 31 Mar 2015 Play Offs Liwest Linz 5 Salzburg 29 Mar 2015 Play Offs Klagenfurt 6 Liwest Linz 29 Mar 2015 Play Offs Vienna Capitals 7 Klagenfurt 26 Mar 2015 Play Offs Salzburg 8 Vienna Capitals 26 Mar 2015 Play Offs Liwest Linz 9 Liwest Linz 24 Mar 2015 Play Offs Vienna Capitals 10 Salzburg 24 Mar 2015 Play Offs Klagenfurt 11 Klagenfurt 22 Mar 2015 Play Offs Salzburg 12 Vienna Capitals 22 Mar 2015 Play Offs Liwest Linz 13 Bolzano 20 Mar 2015 Play Offs Liwest Linz 14 Fehervar AV19 18 Mar 2015 Play Offs Vienna Capitals 15 Liwest Linz 17 Mar 2015 Play Offs Bolzano 16 Vienna Capitals 16 Mar 2015 Play Offs Fehervar AV19 17 Villach 15 Mar 2015 Play Offs Salzburg 18 Klagenfurt 15 Mar 2015 Play Offs Znojmo 19 Bolzano 15 Mar 2015 Play Offs Liwest Linz 20 Liwest Linz 13 Mar 2015 Play Offs Bolzano 21 Fehervar AV19 13 Mar 2015 Play Offs Vienna Capitals 22 Znojmo 13 Mar 2015 Play Offs Klagenfurt 23 Salzburg 13 Mar 2015 Play Offs Villach 24 Klagenfurt 10 Mar 2015 Play Offs Znojmo 25 Vienna Capitals 10 Mar 2015 Play Offs Fehervar AV19 26 Bolzano 10 Mar 2015 Play Offs Liwest Linz 27 Villach 10 Mar 2015 Play Offs Salzburg 28 Liwest Linz 08 Mar 2015 Play Offs Bolzano 29 Znojmo 08 Mar 2015 Play Offs Klagenfurt .. ... ... ... ... 670 TWK Innsbruck 28 Sep 2013 Not specified Znojmo 671 Liwest Linz 27 Sep 2013 Not specified Dornbirn 672 Bolzano 27 Sep 2013 Not specified Graz 99ers 673 Klagenfurt 27 Sep 2013 Not specified Olimpija Ljubljana 674 Fehervar AV19 27 Sep 2013 Not specified Salzburg 675 TWK Innsbruck 27 Sep 2013 Not specified Vienna Capitals 676 Villach 27 Sep 2013 Not specified Znojmo 677 Salzburg 24 Sep 2013 Not specified Olimpija Ljubljana 678 Dornbirn 22 Sep 2013 Not specified TWK Innsbruck 679 Graz 99ers 22 Sep 2013 Not specified Klagenfurt 680 Vienna Capitals 22 Sep 2013 Not specified Villach 681 Fehervar AV19 21 Sep 2013 Not specified Bolzano 682 Dornbirn 20 Sep 2013 Not specified Bolzano 683 Villach 20 Sep 2013 Not specified Graz 99ers 684 Znojmo 20 Sep 2013 Not specified Klagenfurt 685 Olimpija Ljubljana 20 Sep 2013 Not specified Liwest Linz 686 Fehervar AV19 20 Sep 2013 Not specified TWK Innsbruck 687 Salzburg 20 Sep 2013 Not specified Vienna Capitals 688 Villach 15 Sep 2013 Not specified Klagenfurt 689 Liwest Linz 15 Sep 2013 Not specified Dornbirn 690 Vienna Capitals 15 Sep 2013 Not specified Fehervar AV19 691 TWK Innsbruck 15 Sep 2013 Not specified Salzburg 692 Graz 99ers 15 Sep 2013 Not specified Znojmo 693 Olimpija Ljubljana 14 Sep 2013 Not specified Dornbirn 694 Bolzano 14 Sep 2013 Not specified Fehervar AV19 695 Klagenfurt 13 Sep 2013 Not specified Graz 99ers 696 Znojmo 13 Sep 2013 Not specified Salzburg 697 Olimpija Ljubljana 13 Sep 2013 Not specified TWK Innsbruck 698 Bolzano 13 Sep 2013 Not specified Vienna Capitals 699 Liwest Linz 13 Sep 2013 Not specified Villach [700 rows x 4 columns]