【问题标题】:Webscraping amazon using requests and xpath使用请求和 xpath 抓取亚马逊网站
【发布时间】:2021-07-09 15:01:36
【问题描述】:

当您进入亚马逊时,有多个卖家以不同的价格出售,我可以抓取页面上显示的价格,但不能抓取其他卖家的价格。 在“立即购买并添加”列表下方有一个按钮,显示“New(x)from”,如果您单击所有其他卖家出现并且我想刮掉他们的价格,但是当我输入他们的价格 XPath 时它会给我一个错误

from requests_html import HTMLSession

url = 'https://www.amazon.co.uk/Panini-Sticker-Collection- 
x50Packs/dp/B08V8CF748? 
ref_=Oct_DLandingS_D_7a870443_60&smid=A3P5ROKL5A1OLE'


def GetPrice(URL):
    s = HTMLSession()
    r = s.get(url)

    product = {
       'price':r.html.xpath('//*[@id="aod-price-1"]/span/span[2]' )

       }

   print(product)
   return product




GetPrice('https://www.amazon.co.uk/Colgate-Fresh-Cooling-Crystals-Toothpaste/dp/B073V1MB17/ref=sr_1_5_mod_primary_new?dchild=1&keywords=Toothpaste&qid=1625698678&rdc=1&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=8-5')

【问题讨论】:

  • 首先,请先把你的代码清理干净,然后贴在这里,这样不会给我们带来不必要的错误,比如缩进等。请编辑您的问题,并为我们提供更详细的示例,说明您想从该网站上抓取这些内容。
  • 代码已被编辑,主要是堆栈溢出的新缩进,所以也不知道它是如何布置的,我的问题中说明了我正在寻找的内容

标签: python html web-scraping python-requests


【解决方案1】:

要解决此问题,请尝试使用浏览器开发人员工具并检查在任何事件触发时请求是如何加载的,然后尝试通过您的代码复制相同的行为。

代码

import requests
from lxml import html

headers = {
    'authority': 'www.amazon.co.uk',
    'pragma': 'no-cache',
    'cache-control': 'no-cache',
    'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'rtt': '100',
    'sec-ch-ua-mobile': '?0',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0',
    'accept': 'text/html,*/*',
    'x-requested-with': 'XMLHttpRequest',
    'downlink': '8.4',
    'ect': '4g',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'cors',
    'sec-fetch-dest': 'empty',
    'referer': 'https://www.amazon.co.uk/Colgate-Fresh-Cooling-Crystals-Toothpaste/dp/B073V1MB17/ref=sr_1_5_mod_primary_new?dchild=1&keywords=Toothpaste&qid=1625698678&rdc=1&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sr=8-5',
    'accept-language': 'en-US,en;q=0.9',
    'cookie': 'session-id=260-4106472-8409244; i18n-prefs=GBP; ubid-acbuk=260-0481762-4830301; session-token="jc9/khgoELjvvnVyfyUE0zuV+IqwaxQgEelGbV4ihI0VtbHOyZRfQgTpdo7j85y9QuCH+19fCvnLDgNhdjtSrMCWh4U1Pct/A53U0ylVSUCMLNa4HHZqV6q/VBo8EIf0KSIkY47ClNUgwWLkZxzHkm5GWvqvqYBBl7wXIR9zKxY9x0WhN1KrWagXd8Ud062lFMG+ThXyKi0JTHk2K14qmEbPRjE2tmDCZbANgBgXvq4GAXYK/qamSGtiwHIL88aOcKL+4xjmV0o="; csm-hit=adb:adblk_yes&t:1625843678136&tb:s-HPFR45XZN4E5FMK5EH5M|1625843675264; session-id-time=2082758401l',
}

params = (
    ('asin', 'B073V1MB17'),
    ('m', ''),
    ('qid', '1625698678'),
    ('smid', ''),
    ('sourcecustomerorglistid', ''),
    ('sourcecustomerorglistitemid', ''),
    ('sr', '8-5'),
    ('pc', 'dp'),
)
s = requests.Session()

response = s.get('https://www.amazon.co.uk/gp/aod/ajax/ref=dp_aod_NEW_mbc', headers=headers,params=params)

tree = html.fromstring(response.content)

prices = tree.xpath('//span[contains(@class,"a-offscreen")]')

for price in prices[1:]:
    print(price.text)

输出

£1.87
£2.04
£1.44

【讨论】:

  • 嗨,你能解释一下你做了什么以及如何为我的浏览器修改它吗谢谢:),我不明白为什么需要声明标题或参数
  • 返回 []
  • 使用浏览器工具转到网络选项卡,然后 XHR,重新加载页面并查看请求是如何加载的。标头携带元信息,参数携带本案例成功请求并获得所需响应所需的实际数据。
  • @Meh.,对我来说,它返回所有价格值。你能告诉我你是如何执行这段代码的吗?检查上面的输出。
  • 有没有一种方法可以在没有标题或参数的情况下工作,即输入 URL 并获取输入并抓取它,我现在得到相同的输出但是还有 9 个其他卖家有相同的产品并且仅输出 3,我是使用网络爬虫的新手,对于任何愚蠢的问题,我深表歉意
猜你喜欢
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
相关资源
最近更新 更多