我正在创建一个网络抓取 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 搜索找到任何解决方案。
问题是您正在等待表的 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