小能豆

Beautiful Soup Selector 返回一个空列表

py

因此,我正在学习自动化无聊的东西课程,并试图抓取亚马逊上自动化无聊的东西书的价格,但无论如何它都返回一个空字符串,结果出现索引错误elems[0].text.strip(),我不知道该怎么办。

def getAmazonPrice(productUrl):
    headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'} # to make the server think its a web browser and not a bot
    res = requests.get(productUrl, headers=headers)
    res.raise_for_status()


    soup = bs4.BeautifulSoup(res.text, 'html.parser')
    elems = soup.select('#mediaNoAccordion > div.a-row > div.a-column.a-span4.a-text-right.a-span-last')
    return elems[0].text.strip()


price = getAmazonPrice('https://www.amazon.com/Automate-Boring-Stuff-Python-2nd-ebook/dp/B07VSXS4NK/ref=sr_1_1?crid=30NW5VCV06ZMP&dchild=1&keywords=automate+the+boring+stuff+with+python&qid=1586810720&sprefix=automate+the+bo%2Caps%2C288&sr=8-1')
print('The price is ' + price)

阅读 16

收藏
2024-12-12

共1个答案

小能豆

Amazon 可能更改了其网页的 HTML 结构,并且还可能使用动态加载内容(通过 JavaScript)来显示价格等信息。这就是为什么 soup.select() 找不到匹配的元素并导致 elems[0] 引发索引错误。

以下是解决问题的步骤:


解决步骤 1:检查选择器路径是否正确

  • 打开页面 Amazon链接
  • 使用浏览器的开发者工具 (F12) 检查价格元素的 HTML。
  • 找到价格所在的正确 CSS 选择器。

例如:

<span id="kindle-price" class="a-size-base a-color-price a-color-price"> $19.99 </span>

如果 ID 是 kindle-price,你的选择器应该更新为:

elems = soup.select('#kindle-price')

解决步骤 2:动态加载内容

如果价格是通过 JavaScript 动态加载的,那么 requests 无法抓取动态生成的内容。可以改用 selenium 来模拟浏览器并加载 JavaScript。

以下是使用 selenium 的代码示例:

安装所需模块:

pip install selenium

代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def getAmazonPriceWithSelenium(productUrl):
    # 设置 Selenium WebDriver
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")  # 无头模式
    driver = webdriver.Chrome(options=options)

    try:
        driver.get(productUrl)
        time.sleep(3)  # 等待页面加载

        # 使用正确的 CSS 选择器找到价格元素
        price_element = driver.find_element(By.ID, "kindle-price")
        price = price_element.text.strip()
        return price
    finally:
        driver.quit()


price = getAmazonPriceWithSelenium('https://www.amazon.com/Automate-Boring-Stuff-Python-2nd-ebook/dp/B07VSXS4NK/')
print('The price is ' + price)

解决步骤 3:使用 Amazon Product Advertising API

抓取价格信息是违反 Amazon 的服务条款的,可能导致你的 IP 被封禁。更好的方法是使用其官方的 Product Advertising API,该 API 提供合法的方式访问商品价格、评论等信息。


总结

  1. 确保选择器路径准确。
  2. 如果内容是动态加载的,使用 selenium 替代 requests
  3. 考虑使用 Amazon 的官方 API 以避免被封禁。

抓取过程中注意遵守网站的使用条款,避免频繁请求或绕过反爬机制。

2024-12-12