Hay muchas preguntas de raspado de selenio, pero ninguna que se ajuste a mi problema. Quiero descargar ~2000 imágenes ubicadas dentro de un elemento de desplazamiento. Las imágenes solo se cargan cuando se desplazan más allá. Al inspeccionar el HTML, los elementos no están allí antes de desplazarse, lo que parece diferente a la carga diferida. En cualquier caso, esta solución no funciona. Lo que sí funciona es desplazarse de forma incremental por el elemento de desplazamiento y descargar todas las imágenes disponibles después de cada pequeño desplazamiento.
import numpy as np from Selenium import webdriver from os.path import join from bs4 import BeautifulSoup import time wd = webdriver.Chrome('chromedriver') # Find height of the scroll element js_get_scroll_height = f'return document.querySelector(<ugly-hack-to-select-correct-element>).scrollHeight' scroll_height = wd.execute_script(js_get_scroll_height) heights_to_scroll = np.arange(0,scroll_height,1200) # Incrementally scroll and download for next_height in heights_to_scroll: js_scroll = f'document.querySelector(<ugly-hack-to-select-correct-element>).scrollTo(0,{next_height})' wd.execute_script(js_scroll) time.sleep(2) soup = BeautifulSoup(wd.page_source, 'html.parser') new_img_urls = [item['src'] for item in soup.find_all('img')] for img_url in new_img_urls: fpath = join(model_name,img_url + '.jpg') if os.path.isfile(fpath): print('skipping {file_path} because already exists') else: saved_image(fpath,img_url)
El problema es que las imágenes solo se cargan, es decir, aparecen en el HTML, si la ventana de Chrome generada por Selenium está en primer plano en mi computadora. De hecho, necesito estar mirando la página mientras se realiza el desplazamiento. Si, en cambio, estoy haciendo otra cosa en mi computadora o si se va a dormir (lo que sucede porque todo este proceso toma ~ 10 minutos), entonces new_img_urls
simplemente termina como una lista vacía.
Esto no funcionará para mí porque quiero poder repetir el proceso en unas pocas docenas de páginas web diferentes (con el mismo formato). ¿Cómo puedo lograr lo mismo con Chrome en segundo plano?