2017-11-11 77 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