使用Python的BeautifulSoup爬取度假页面总价失败,求其他方法
可行的爬取方法推荐
你的问题核心是目标网站的总价是通过JavaScript动态渲染生成的,而BeautifulSoup只能解析静态HTML,自然无法获取动态加载的数据。以下是几种有效的解决方法:
方法1:用Selenium模拟浏览器渲染
Selenium会启动真实浏览器,等待页面JS执行完成后再抓取元素,适合处理动态渲染页面:
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 # 初始化Chrome浏览器(需提前安装对应版本的chromedriver) driver = webdriver.Chrome() target_url = "https://r.pl/mozaika-polnocy/zakwaterowanie-mrg?data=20230901&miastoWyjazdu=katowice&wyzywienie=2-posilki&wiek=1993-03-11&wiek=1993-03-11&liczbaPokoi=1&czyCenaZaWszystkich=0&iataWyjazdu=WAW&dlugoscPobytu=15&hotelNaPrzedluzenie=riu-tikida-palace-taghazout" driver.get(target_url) # 等待总价元素加载(需先在页面中定位总价对应的CSS类或XPath,示例用class假设) try: total_price_elem = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "total-price")) ) print("总价:", total_price_elem.text) finally: driver.quit()
注意:需安装Selenium包(pip install selenium),并确保chromedriver版本与本地Chrome一致。
方法2:抓包获取后端API接口
直接抓取页面加载时调用的API接口,效率比模拟浏览器更高:
- 打开目标页面,按F12打开开发者工具,切换到「Network」标签,勾选「XHR」选项;
- 刷新页面,筛选出包含价格数据的API请求(通常命名含
price、offer等关键词); - 复制该请求的URL、请求头和参数,用requests直接请求:
import requests # 复制浏览器中的请求头,确保包含User-Agent、Cookie等关键信息 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Cookie": "此处复制浏览器中的Cookie值" } # 替换为抓包得到的API地址 api_url = "https://example.com/api/get-price" # 替换为API所需的参数 params = {"data": "20230901", "miastoWyjazdu": "katowice"} response = requests.get(api_url, headers=headers, params=params) price_data = response.json() # 根据API返回的JSON结构提取总价 total_price = price_data["offer"]["total"] print("总价:", total_price)
注意:部分API需要携带有效的Cookie或认证信息,需确保请求头与浏览器完全一致。
方法3:用Playwright替代Selenium
Playwright是微软推出的轻量自动化工具,API更简洁,支持多浏览器:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto(target_url) # 等待总价元素加载并获取文本 total_price = page.wait_for_selector(".total-price").text_content() print("总价:", total_price) browser.close()
安装方式:先执行pip install playwright,再运行playwright install安装浏览器驱动。
内容的提问来源于stack exchange,提问作者Karas
相关产品推荐
相关产品推荐

