是否有人使用 Beautifulsoup 从亚马逊成功抓取?

Is there someone have success in scraping from Amazon using Beautifulsoup?

我想做一个亚马逊的网络爬虫

但是,看起来每个数据都是None类型。

我在google找到了很多人在做亚马逊的网络爬虫

请给我一些解决此 None 类型问题的建议。

这是我的代码:

import requests
from bs4 import BeautifulSoup

amazon_dir = requests.get("https://www.amazon.es/s?k=docking+station&__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=34FO3BVVCJS4V&sprefix=docking%2Caps%2C302&ref=nb_sb_ss_ts-doa-p_1_7")
amazon_soup = BeautifulSoup(amazon_dir.text, "html.parser")
product_table = amazon_soup.find("div", {"class": "sg-col-inner"})
print(product_table)

products = product_table.find("div", {"class": "a-section"})
name = products.find("span", {"class": "a-size-base-plus"})
rating = products.find("span", {"class": "a-icon-alt"})
price = products.find("span", {"class": "a-price-whole"})
print(name, rating, price)

谢谢

门户网站可能会检查 header User-Agent 以针对不同的浏览器或设备发送不同的 HTML,有时这会导致在页面上查找元素时出现问题。

但通常门户网站会检查此 header 以阻止 scripts/bots。
例如 requests 发送 User-Agent: python-requests/2.26.0.

如果我在真实浏览器或至少较短的版本 Mozilla/5.0 中使用 header User-Agent,则代码可以工作。


还有其他问题。

几乎有 70 个元素 <div class="sg-col-inner" ...>,table 是第 3 个元素,但 find() 只给出第一个元素。您必须使用 find_all(),然后使用 [2] 来获取第 3 个元素。


import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0',
}    

url = "https://www.amazon.es/s?k=docking+station&__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=34FO3BVVCJS4V&sprefix=docking%2Caps%2C302&ref=nb_sb_ss_ts-doa-p_1_7"
response = requests.get(url, headers=headers)

print(response.text[:1000])
print('---')

amazon_soup = BeautifulSoup(response.text, "html.parser")
all_divs = amazon_soup.find_all("div", {"class": "sg-col-inner"})

print('len(all_divs):', len(all_divs))
print('---')

products = all_divs[3].find("div", {"class": "a-section"})
name = products.find("span", {"class": "a-size-base-plus"})
rating = products.find("span", {"class": "a-icon-alt"})
price = products.find("span", {"class": "a-price-whole"})
print('name:', name.text)
print('rating:', rating.text)
print('price:', price.text)

编辑:

显示所有产品的版本:

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0',
}    

url = "https://www.amazon.es/s?k=docking+station&__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=34FO3BVVCJS4V&sprefix=docking%2Caps%2C302&ref=nb_sb_ss_ts-doa-p_1_7"
response = requests.get(url, headers=headers)

#print(response.text[:1000])
#print('---')

soup = BeautifulSoup(response.text, "html.parser")

results = soup.find("div", {"class": "s-main-slot s-result-list s-search-results sg-row"})

all_products = results.find_all("div", {"class": "sg-col-inner"})
print('len(all_products):', len(all_products))
print('---')

for item in all_products:
    name = item.find("span", {"class": "a-size-base-plus"})
    rating = item.find("span", {"class": "a-icon-alt"})
    price = item.find("span", {"class": "a-price-whole"})
    if name:
        print('name:', name.text)
    if rating:
        print('rating:', rating.text)
    if price:
        print('price:', price.text)
    if name or rating or price:
        print('---')

顺便说一句:

门户网站会不时刷新服务器上的代码和 HTML - 因此,如果您找到教程,请检查它有多旧。较旧的教程可能不起作用,因为门户可能会更改代码中的某些内容。

许多现代页面开始使用 JavaScript 添加元素,但 requestsBeautifulSoup 不能 运行 JavaScript。这可能需要使用 Selenium 来控制真正的网络浏览器,它可以 运行 JavaScript.