2

Ich habe ein Skript in Python geschrieben, um einige Namen von einer Webseite zu analysieren. Die Elemente, die auf dieser Webseite verfügbar sind, werden nicht alle gleichzeitig angezeigt, sondern es ist notwendig, nach unten zu blättern, um die Webseite einige weitere Elemente freigeben zu lassen, und wieder einige nach einem anderen Bildlauf usw., bis alle Elemente sichtbar sind. Das Problem ist, dass die Elemente nicht im Körper befinden, weshalb driver.execute_script("return document.body.scrollHeight;") dieser Befehl nicht funktioniert (IMO). Es befindet sich im linken Bereich wie ein Schiebebehälter. Wie kann ich den Boden dieses Containers erreichen und die Namen dieser Webseite analysieren? Ich habe fast alle Codes außer dem Lazy-Load geschrieben. Ich füge ein Bild an, um Ihnen eine Idee zu geben, was ich damit zu tun haben wollte, indem ich es als verschiebbaren Container bezeichnete.Kann nicht alle Shop-Namen von einer Webseite sammeln

Der Link zu dieser Webseite: Link

Das, was ich bisher versucht:

from selenium import webdriver; import time 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 
driver.get("replace_the_above_link") 

check_height = driver.execute_script("return document.body.scrollHeight;") 
while True: 
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    time.sleep(3) 
    height = driver.execute_script("return document.body.scrollHeight;") 
    if height == check_height: 
     break 
    check_height = height 

for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".select_list h2 a"))): 
    print(item.text) 

driver.quit() 

Dies ist das Bild dieser Box, den Artikel enthält: Click Here

Derzeit meinen Schaber analysiert Elemente, die beim Laden der Seite sichtbar sind.

Antwort

3

Im Folgenden Code sollte Ihnen ermöglichen, XHR-Anforderungen zu machen, indem Behälter so viel Zeit wie möglich Scrollen und dann kratzen erforderlichen Daten:

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 
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 
driver.get("https://www.weedsta.com/dispensaries/in/california") 

entries_count = len(wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "select_list")))) 

while True: 
    driver.find_element_by_class_name("tel").send_keys(Keys.END) 
    try: 
     wait.until(lambda driver: entries_count < len(driver.find_elements_by_class_name("select_list"))) 
    except: 
     break 


for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".select_list h2 a"))): 
    print(item.text) 

driver.quit() 
+0

Dank Herr Andersson, für Ihre Intervention und das Skript. Plus eins dafür. Wie auch immer, wenn ich deinen Code ausführe, produziert er das selbe Ergebnis wie ich zuerst ohne Scrollen hatte. Sollte ich irgendwo innerhalb der while-Schleife eine hardcoded Verzögerung setzen? Nochmals vielen Dank für Ihre Antwort, Sir. – SIM

+0

Hmm .. Das ist komisch ... Hast du es genau so benutzt, wie es in meiner Antwort steht oder einige Änderungen vorgenommen? – Andersson

+0

Nein, Sir, keine Änderung wird gemacht. Ich wage es kaum. Ich habe es genau so ausgeführt wie es ist. – SIM

Verwandte Themen