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

Posted

技术标签:

【中文标题】有人使用 Beautifulsoup 从亚马逊抓取成功吗?【英文标题】:Is there someone have success in scraping from Amazon using Beautifulsoup? 【发布时间】:2022-01-18 00:32:48 【问题描述】:

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

但是,everydata 好像是 None 类型。

我在 google 上发现,有很多人在制作亚马逊的网络爬虫。

请给我一些建议来解决这个 Nonetype 问题。

这是我的代码:

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)

谢谢

【问题讨论】:

先查看响应码,尝试添加用户代理!检查网站是否使用JS。 @αԋɱҽԃαмєяιcαη 我从不这样做。但是,我会找到并尝试一下。谢谢 如果amazon.es 使用javascript 那么requests + BeautifulSoup 将不起作用,因为它们无法运行JavaScript。我不确定,但对于某些国家/地区Amazon 可能使用JavaScript,而对于其他国家/地区它可能在没有JavaScript 的情况下运行。或者也许很久以前Amazan 在没有JavaScript 的情况下运行,但现在使用JavaScript - 你应该检查互联网上的教程/帖子的年龄。 如果我使用标题 User-Agent: Mozilla/5.0,代码对我有用 @furas 非常感谢。不适用于这种情况,但是我如何知道该网站是否使用 JavaScript 运行?我想知道 【参考方案1】:

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

但通常门户网站会检查此标头以阻止脚本/机器人。 例如requests 发送User-Agent: python-requests/2.26.0

如果我使用来自真实浏览器的标题 User-Agent 或至少更短的版本 Mozilla/5.0,那么代码可以工作。


还有其他问题。

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


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的真实网络浏览器。

【讨论】:

以上是关于有人使用 Beautifulsoup 从亚马逊抓取成功吗?的主要内容,如果未能解决你的问题,请参考以下文章

Beautifulsoup4错误选择多个属性

抓取亚马逊客户评论

Django 网站有时不打印任何东西

BeautifulSoup - 亚马逊和谷歌将我识别为机器人;我该如何解决?

使用 BS4 或 Selenium 从 finishline.com 抓取网页

BeautifulSoup 使用循环从多个 div 中抓取信息到 JSON