代码之家  ›  专栏  ›  技术社区  ›  CompressedSquid

在TAMU餐饮网站上无法使用Selenium进行动态网页浏览

  •  0
  • CompressedSquid  · 技术社区  · 2 年前

    我正在创建一个网络抓取API,它将抓取我所在大学的食堂网站,并根据一天中的时间提取目前提供的食物。目前,网页抓取器不仅在餐厅页面上工作。

    其他动态网站,如果禁用JavaScript,内容就不会加载,可以使用当前代码(我使用了一个我一直在使用React开发的前端应用程序)。

    from selenium import webdriver 
    from selenium.webdriver.common.by import By 
    from selenium.webdriver.chrome.service import Service as ChromeService 
    from webdriver_manager.chrome import ChromeDriverManager 
     
    url = 'https://music-bridge.lucagiannotti.com/' 
     
    driver = webdriver.Chrome(service=ChromeService( 
        ChromeDriverManager().install())) 
     
    driver.get(url) 
     
    
    elements = driver.find_elements(By.CLASS_NAME, 'container') 
    for title in elements:
        print(title.text)
    

    这段代码确实产生了类下的所有元素 container . 然而,如果我刮擦餐厅页面,无论我上什么课,它都不会打印任何内容。

    from selenium import webdriver 
    from selenium.webdriver.common.by import By 
    from selenium.webdriver.chrome.service import Service as ChromeService 
    from webdriver_manager.chrome import ChromeDriverManager 
     
    url = 'https://dineoncampus.com/tamu/whats-on-the-menu' 
     
    driver = webdriver.Chrome(service=ChromeService( 
        ChromeDriverManager().install())) 
     
    driver.get(url) 
     
    print(driver.page_source)
    
    # select elements by class name 
    elements = driver.find_elements(By.CLASS_NAME, 'table') 
    for title in elements:
        print(title.text)
    

    我认为这可能是页面加载的问题,但在测试了这段代码后,这也不是问题所在。加载整个页面,所有内容都可见,但 table 类永远找不到。

    from selenium import webdriver 
    from selenium.webdriver.common.by import By 
    from selenium.webdriver.chrome.service import Service as ChromeService 
    from webdriver_manager.chrome import ChromeDriverManager 
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
     
    url = 'https://dineoncampus.com/tamu/whats-on-the-menu' 
     
    driver = webdriver.Chrome(service=ChromeService( 
        ChromeDriverManager().install())) 
    driver.get(url) 
    
    wait = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.ID, "table"))
    )
    
     
    # print(driver.page_source)
    
    # select elements by class name 
    elements = driver.find_elements(By.CLASS_NAME, 'table') 
    for title in elements:
        print(title.text)
    

    我确信这与页面加载JavaScript的方式有关,但我并不确切知道问题是什么,也没有通过谷歌搜索找到任何解决方案。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Carl Peterson    2 年前

    问题是,您正在等待表的ID出现,但这不会发生。您需要表的CLASS_NAME,或者类似菜单项的东西。

    切换到 EC.presence_of_element_located((By.CLASS_NAME, "menu-items")) :

    Grill
    Item
    Portion
    Calories
    Eggs Made to Order
    2 cage free eggs prepared to order
    Nutritional Info
    1 each
    60
    Hash Browns
    Nutritional Info
    1/2 cup
    180
    Pork Sausage Link
    Spiced breakfast sausage
    Nutritional Info
    2 each
    260
    Vegetable Omelet
    Nutritional Info
    1 each
    140
    Cheese Omelet
    Nutritional Info
    5 oz portion
    ...
    Oats 'n Honey Granola
    Nutritional Info
    1 tbsp
    20