使用 Selenium 进行动态 Web scaping 在 TAMU 餐饮网站上不起作用

问题描述 投票:0回答:1

我正在创建一个网络抓取 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 的方式有关,但我不知道到底是什么问题,也没有通过 Google 搜索找到任何解决方案。

python selenium-webdriver web-scraping
1个回答
0
投票

问题是您正在等待表的 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
© www.soinside.com 2019 - 2024. All rights reserved.