因此,我正在学习自动化无聊的东西课程,并试图抓取亚马逊上自动化无聊的东西书的价格,但无论如何它都返回一个空字符串,结果出现索引错误elems[0].text.strip(),我不知道该怎么办。
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)
Amazon 可能更改了其网页的 HTML 结构,并且还可能使用动态加载内容(通过 JavaScript)来显示价格等信息。这就是为什么 soup.select() 找不到匹配的元素并导致 elems[0] 引发索引错误。
soup.select()
elems[0]
以下是解决问题的步骤:
例如:
<span id="kindle-price" class="a-size-base a-color-price a-color-price"> $19.99 </span>
如果 ID 是 kindle-price,你的选择器应该更新为:
kindle-price
elems = soup.select('#kindle-price')
如果价格是通过 JavaScript 动态加载的,那么 requests 无法抓取动态生成的内容。可以改用 selenium 来模拟浏览器并加载 JavaScript。
requests
selenium
以下是使用 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)
抓取价格信息是违反 Amazon 的服务条款的,可能导致你的 IP 被封禁。更好的方法是使用其官方的 Product Advertising API,该 API 提供合法的方式访问商品价格、评论等信息。
抓取过程中注意遵守网站的使用条款,避免频繁请求或绕过反爬机制。