【问题标题】:Scraping Amazon using BeautifulSoup on AWS Lambda在 AWS Lambda 上使用 BeautifulSoup 抓取 Amazon
【发布时间】:2021-03-17 17:43:54
【问题描述】:

我正在开展一个项目,该项目需要我使用 AWS Lambda 从亚马逊抓取产品标题/名称。我的代码如下:

import json
from bs4 import BeautifulSoup
from googleapiclient.discovery import build
import requests
import base64


def lambda_handler(event, context):
 
    headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0"}
    URL = "https://www.amazon.in/Amazon-Brand-Solimo-Foliage-Bedsheet/dp/B076ZTSW47/ref=sr_1_6_mod_primary_lightning_deal?dchild=1&pd_rd_r=53f449ad-419e-466d-bab8-2a09a026efc6&pd_rd_w=5XoS9&pd_rd_wg=VXhi2&pf_rd_p=d848f904-cfb3-4815-b7b2-fe0f44e4153f&pf_rd_r=B9HGM8VTCBCPSTBNW5Z6&qid=1616001168&refinements=p_n_format_browse-bin%3A19560802031&s=kitchen&sbo=Tc8eqSFhUl4VwMzbE4fw%2Fw%3D%3D&smid=AT95IG9ONZD7S&sr=1-6"

    content = requests.get(URL, headers = headers)
    soup = BeautifulSoup(content.text, 'html.parser')
    title = soup.find("span", attrs={"id":'productTitle'}).string.strip()

    return {
         'title' : title,
     }

由于某种原因,这仅在我的 URL 来自 Amazon.in(印度)而不是 amazon.com(美国)时才有效 *注意:我不在印度(不确定这是否在任何事情中起作用)

如果我保持所有其他内容不变,只需将 URL 更改为来自 amazon.com(美国)的内容。当我检查 .in 和 US 页面时,它们都有一个带有 id 'productTitle' 的 span 元素 例如:

URL = https://www.amazon.com/Saucony-Mens-Kinvara-Running-Shoe/dp/B07Q8Y4GQL/?_encoding=UTF8&pd_rd_w=c0VM8&pf_rd_p=de0c3fe6-321f-473e-bef6-6a700af423d3&pf_rd_r=S7482G8JKWVS6GB5ADG8&pd_rd_r=faa67bb1-ca9b-4c1d-a730-21c49cfd9b35&pd_rd_wg=KiSz4&ref_=pd_gw_trq_rep_sims_gw

我收到此错误:

Response
{
 "errorMessage": "'NoneType' object has no attribute 'string'",
 "errorType": "AttributeError",
 "stackTrace": [
   [
     "/var/task/lambda_function.py",
     14,
     "lambda_handler",
     "title = soup.find(\"span\", attrs={\"id\":'productTitle'}).string.strip()"
   ]
 ]

}

我很确定这与用户代理和亚马逊禁止抓取有关。我对网络抓取非常陌生,所以如果我做错了什么或者是否有任何其他更改需要,请告诉我。我拥有的代码非常简单,所以我很确定错误出在标头/用户代理上,但再一次,我对此很陌生,需要一些指导

编辑:@MendelG suggested an answer 实际上可以在 Pycharm 或 Spyder 等其他 IDE 上工作,但在 AWS Lambda 上仍然会出现同样的错误,有人知道 lambda 以不同方式执行它的原因吗?强>

【问题讨论】:

  • 我觉得你用他们自己的服务刮亚马逊很有趣,但这无关紧要。 :) 相关的是,如果它击中 .com.de,它们会阻止你的抓取工具。所以,我想你最好还是坚持.in
  • 问题是它需要在amazon.com(美国)上使用
  • 我认为他们希望您使用亚马逊产品 API 而不是抓取网站。
  • 在哪里可以找到亚马逊产品 API?
  • 我只能找到广告 API,但找不到产品

标签: python amazon-web-services web-scraping beautifulsoup aws-lambda


【解决方案1】:

"upgrade-insecure-requests": "1" 添加到您的headers

headers = {
    "upgrade-insecure-requests": "1",
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0",
}

import requests
from bs4 import BeautifulSoup


headers = {
    "upgrade-insecure-requests": "1",
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0",
}

URL = "https://www.amazon.com/Saucony-Mens-Kinvara-Running-Shoe/dp/B07Q8Y4GQL/?_encoding=UTF8&pd_rd_w=c0VM8&pf_rd_p=de0c3fe6-321f-473e-bef6-6a700af423d3&pf_rd_r=S7482G8JKWVS6GB5ADG8&pd_rd_r=faa67bb1-ca9b-4c1d-a730-21c49cfd9b35&pd_rd_wg=KiSz4&ref_=pd_gw_trq_rep_sims_gw"
soup = BeautifulSoup(requests.get(URL, headers=headers).content, "html.parser")

print(soup.find("span", attrs={"id": "productTitle"}).string.strip())

输出:

Saucony Men's Kinvara 10 Running Shoe

【讨论】:

  • 这对我不起作用。我得到了完全相同的错误
  • @AdministrativeLab0284 很有趣。我添加了我的完整代码,如果你复制它,看看它是否有效。
  • hmm 似乎正在使用 PyCharm 但不是 AWS Lambda
  • @AdministrativeLab0284 我不确定如何提供进一步的帮助。等待其他答案。
  • 这是否在 lambda 中为您正确运行?
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2015-05-03
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多