Python Splinter (Selenium HQ) ¿Cómo tomar una captura de pantalla de muchas páginas web?

Quiero hacer una captura de pantalla de muchas páginas web, escribí esto:

from splinter.browser import Browser import urllib2 from urllib2 import URLError urls = ['http://ubuntu.com/', 'http://xubuntu.org/'] try : browser = Browser('firefox') for i in range(0, len(urls)) : browser.visit(urls[i]) if browser.status_code.is_success() : browser.driver.save_screenshot('your_screenshot' + str(i) + '.png') browser.quit() except SystemError : print('install firefox!') except urllib2.URLError, e: print(e) print('theres no such website') except Exception, e : print(e) browser.quit() 

y me salió este error:

  

¿Como arreglarlo?:)

EDITAR

Cuando tengo enlaces en el archivo txt, el siguiente código no funciona:

 from splinter import Browser import socket urls = [] numbers = [] with open("urls.txt", 'r') as filename : for line in filename : line = line.strip() words = line.split("\t") numbers.append(str(words[0])) urls.append(str(words[1].rstrip())) print(urls) browser = None try: browser = Browser('firefox') for i, url in enumerate(urls, start=1): try: browser.visit(url) if browser.status_code.is_success(): browser.driver.save_screenshot('your_screenshot_%03d.png' % i) except socket.gaierror, e: print "URL not found: %s" % url finally: if browser is not None: browser.quit() 

Mi archivo txt se ve así:

 1 http//ubuntu.com/ 2 http//xubuntu.org/ 3 http//kubuntu.org/ 

cuando lo ejecuté, me dieron errores:

 $ python test.py ['http//ubuntu.com/', 'http//xubuntu.org/', 'http//kubuntu.org/'] Traceback (most recent call last): File "test.py", line 21, in  browser.visit(url) File "/usr/local/lib/python2.7/dist-packages/splinter/driver/webdriver/__init__.py", line 79, in visit self.driver.get(url) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 168, in get self.execute(Command.GET, {'url': url}) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 156, in execute self.error_handler.check_response(response) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 147, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: u'Component returned failure code: 0x804b000a (NS_ERROR_MALFORMED_URI) [nsIIOService.newURI]' 

¿Qué pasa esta vez?

Su problema es que hace browser.quit() dentro de su bucle a través de las URL, por lo que ya no está abierto para la segunda URL.

Aquí hay una versión actualizada de su código:

 from splinter import Browser import socket urls = ['http://ubuntu.com/', 'http://xubuntu.org/'] browser = None try: browser = Browser('firefox') for i, url in enumerate(urls, start=1): try: browser.visit(url) if browser.status_code.is_success(): browser.driver.save_screenshot('your_screenshot_%03d.png' % i) except socket.gaierror, e: print "URL not found: %s" % url finally: if browser is not None: browser.quit() 

El cambio más importante es mover el código browser.quit() al finally controlador de excepciones, para que suceda sin importar lo que esté mal. Tenga en cuenta también el uso de enumerate para proporcionar tanto el valor del iterador como su índice; Este es el enfoque recomendado en Python para mantener su propio puntero de índice.

No estoy seguro de si es relevante para su código, pero encontré excepciones splinter socket.gaierror en urllib2.URLError sobre urllib2.URLError , así que mostré cómo podría atraparlas también. Moví este controlador de excepciones dentro del bucle; esto continuará capturando las capturas de pantalla restantes incluso si una o más de las URL no existen.