python - 无法从网页收集所有店铺名称

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

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

目前我的抓取工具正在解析页面加载时可见的项目。

最佳答案

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

关于python - 无法从网页收集所有店铺名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47236652/

相关文章:

linux - 免root升级glibc

Python Polars 滚动计数

python - 带有 Lookbehind 的正则表达式拆分丢失了下半部分

java - 如何在 cucumber 中编写空字符串和非空字符串的正则表达式

python - 通过 python 创建一个 vlan 并将其添加到网络命名空间

Python:使用 "..%(var)s.."% locals() 是一个好习惯吗?

python - cPickle 下溢错误

python - 给定一个视频名称列表 L 及其观看率,编写一个函数来返回观看率排名前 10 的视频

python - 从Google Play商店应用网站中提取评论

javascript - 设置输入值而不是 sendKeys() - Selenium WebDriver nodejs