如何通过使用SeleniumWebdriver和Python滚动查找网页上的所有元素

时间:2018-12-08 07:45:39

标签: javascript python-3.x selenium lazy-loading webdriverwait

我似乎无法在网页上获得所有元素。无论我尝试过使用硒如何。我确定我缺少什么。这是我的代码。该网址至少有30个元素,但是每当我抓取时,只有6个元素返回。我想念什么?

import requests
import webbrowser
import time
from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException



headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
url = 'https://www.adidas.com/us/men-shoes-new_arrivals'

res = requests.get(url, headers = headers)
page_soup = bs(res.text, "html.parser")


containers = page_soup.findAll("div", {"class": "gl-product-card-container show-variation-carousel"})


print(len(containers))
#for each container find shoe model
shoe_colors = []

for container in containers:
    if container.find("div", {'class': 'gl-product-card__reviews-number'}) is not None:
        shoe_model = container.div.div.img["title"]
        review = container.find('div', {'class':'gl-product-card__reviews-number'})
        review = int(review.text)



driver = webdriver.Chrome()
driver.get(url)
time.sleep(5)
shoe_prices = driver.find_elements_by_css_selector('.gl-price')

for price in shoe_prices:
    print(price.text)
print(len(shoe_prices))

2 个答案:

答案 0 :(得分:1)

您必须缓慢向下滚动页面。查看产品时,它仅会请求使用ajax的价格数据。

options = Options()
options.add_argument('--start-maximized')
driver = webdriver.Chrome(options=options)

url = 'https://www.adidas.com/us/men-shoes-new_arrivals'
driver.get(url)

scroll_times = len(driver.find_elements_by_class_name('col-s-6')) / 4 # (divide by 4 column product per row)
scrolled = 0
scroll_size = 400

while scrolled < scroll_times:
    driver.execute_script('window.scrollTo(0, arguments[0]);', scroll_size)
    scrolled +=1
    scroll_size += 400
    time.sleep(1)

shoe_prices = driver.find_elements_by_class_name('gl-price')

for price in shoe_prices:
    print(price.text)

print(len(shoe_prices))

答案 1 :(得分:0)

因此,使用您的代码试用版的结果似乎有所不同:

  • 您发现具有请求 30 个项目和具有 Selenium
  • 6 个项目
  • 在哪里找到 40 个带有请求的项目和 4 个带有 Selenium
  • 的项目

此网站上的此项是通过Lazy Loading动态生成的,因此您必须scrollDown并等待新元素在HTML DOM中呈现,您可以使用以下解决方案:< / p>

  • 代码块:

    import requests
    import webbrowser
    from bs4 import BeautifulSoup as bs
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.common.exceptions import NoSuchElementException, TimeoutException
    
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}
    url = 'https://www.adidas.com/us/men-shoes-new_arrivals'
    res = requests.get(url, headers = headers)
    page_soup = bs(res.text, "html.parser")
    containers = page_soup.findAll("div", {"class": "gl-product-card-container show-variation-carousel"})
    print(len(containers))
    shoe_colors = []
    for container in containers:
        if container.find("div", {'class': 'gl-product-card__reviews-number'}) is not None:
        shoe_model = container.div.div.img["title"]
        review = container.find('div', {'class':'gl-product-card__reviews-number'})
        review = int(review.text)
    options = Options()
    options.add_argument('start-maximized')
    options.add_argument('disable-infobars')
    options.add_argument('--disable-extensions')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get(url)
    myLength = len(WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "span.gl-price"))))
    while True:
        driver.execute_script("window.scrollBy(0,400)", "")
        try:
            WebDriverWait(driver, 20).until(lambda driver: len(driver.find_elements_by_css_selector("span.gl-price")) > myLength)
            titles = driver.find_elements_by_css_selector("span.gl-price")
            myLength = len(titles)
        except TimeoutException:
            break
    print(myLength)
    for title in titles:
        print(title.text)
    driver.quit()
    
  • 控制台输出:

    47
    $100
    $100
    $100
    $100
    $100
    $100
    $180
    $180
    $180
    $180
    $130
    $180
    $180
    $130
    $180
    $130
    $200
    $180
    $180
    $130
    $60
    $100
    $30
    $65
    $120
    $100
    $85
    $180
    $150
    $130
    $100
    $100
    $80
    $100
    $120
    $180
    $200
    $130
    $130
    $100
    $120
    $120
    $100
    $180
    $90
    $140
    $100