2017-11-11 113 views
2

我已經寫在python腳本從網頁解析某些名稱收集所有的商店名稱。該網頁中的可用項目不會一次全部顯示,而是需要滾動到最下方纔能讓網頁發佈更多項目,並且再次滾動更多項目,直到所有項目都可見爲止。問題是項目不在身體內,這就是爲什麼driver.execute_script("return document.body.scrollHeight;")這個命令不起作用(IMO)。它位於滑動容器的左側區域。我怎樣才能到達該容器的底部,並解析這個網頁的名字?除了控制延遲加載外,我寫了幾乎所有的代碼。我附上一張圖片,告訴你我想通過將它稱爲滑動容器來表達什麼意思。無法從網頁

鏈接到網頁:Link

這是我到目前爲止已經試過:

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() 

這是那個盒子的包含項目形象:Click Here

目前我刮刀解析頁面加載時可見的項目。

回答

3

下面的代碼應允許您通過滾動容器儘可能多的時間儘可能地使XHR請求,然後刮所需數據:

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

感謝安德森先生,您的干預和腳本。再加一個吧。無論如何,當我執行你的代碼時,它會產生與我第一次沒有滾動的結果相同的結果。我應該在while循環中的任何位置放置硬編碼延遲嗎?再次感謝您的回答先生。 – SIM

+0

嗯..這很奇怪...你是否完全按照我的回答或修改的方式使用它? – Andersson

+0

不,先生,沒有修改。我幾乎不敢這麼做。我已經執行了它的確如此。 – SIM