【问题标题】:Unable to collect all the shop names from a webpage无法从网页中收集所有店铺名称
【发布时间】:2018-04-24 12:02:13
【问题描述】:

我在 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

目前我的爬虫正在解析页面加载时可见的项目。

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver web-scraping


    【解决方案1】:

    下面的代码应该允许您通过尽可能多地滚动容器来发出 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()
    

    【讨论】:

    • 感谢安德森爵士的干预和剧本。加一个。无论如何,当我执行您的代码时,它会产生与我一开始没有滚动时相同的结果。我应该在 while 循环中的任何地方放置硬编码延迟吗?再次感谢您的回答先生。
    • 嗯..这很奇怪...您是否完全按照我的答案中显示的方式使用它或进行了一些修改?
    • 不,先生,没有进行任何修改。我几乎不敢这样做。我已经按原样执行了。
    • 又试了一次,仍然可以完美运行...您可以分享 chromedriver、Chrome 和 selenium 版本吗?
    • 试图找出版本。很快就会回来。谢谢先生。顺便说一句,我自愿尝试使其工作for i in range(len(entries_count)):entries_count.send_keys(Keys.END),但抛出错误object of type 'int' has no len()。
    猜你喜欢
    • 2021-04-08
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2021-06-29
    • 2019-04-11
    • 2013-09-10
    相关资源
    最近更新 更多