【问题标题】:How can i scrape Aliexpress product data我如何抓取 Aliexpress 产品数据
【发布时间】:2020-08-05 10:47:55
【问题描述】:

我正在尝试使用 Python 和 BeautifulSoup 抓取 product page 的 Aliexpress 产品数据。

我使用使用 SelectorLib 创建的 Aliexpress CSS 选择器运行引用 YML 文件 (aliexpress.yml) 的下一个代码:

from selectorlib import Extractor
import requests
import json
import argparse

argparser = argparse.ArgumentParser()
argparser.add_argument('url', help='Amazon Product Details URL')
# Create an Extractor by reading from the YAML file
e = Extractor.from_yaml_file('./aliexpress.yml')

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'
headers = {'User-Agent': user_agent}
# Download the page using requests
args = argparser.parse_args()
r = requests.get(args.url, headers=headers)
# Pass the HTML of the page and create
data = e.extract(r.text)
# Print the data
print(json.dumps(data, indent=True))

我收到下一个回复:

{
 "name": null,
 "price": null,
 "image": null
}

我还有其他用于亚马逊和其他电子商务的 YML 文件并且可以正常工作,但使用 Aliexpress 它返回 null。很奇怪,因为在SelectorLib中我可以正确查看预览数据,所以YML文件是正确的。

可能是 Aliexpress 阻止了我的抓取?如何在没有空响应的情况下抓取 Aliexpress 数据?

【问题讨论】:

  • 你查看r.text的内容了吗?
  • Extractor如何解析数据?
  • 当他们publish an API 时为什么要抓取他们的 HTML?
  • @HristoIliev 我检查了 r.text 似乎我正在寻找的 css 选择器没有出现在那里。为什么不出现?,当我检查 aliexpress 链接时,可以识别 css 选择器。
  • 也许网页是使用 JavaScript 动态创建的。你看过页面源吗?有一大块 JavaScript 包含大量数据,可能还有您需要从页面中抓取的所有内容。另外,使用他们的 API。

标签: python beautifulsoup


【解决方案1】:
  1. 页面是通过JavaScript加载的,所以requests不会帮助你渲染JS。您可以使用selenium 或任何呈现JS 的模块。
  2. 我注意到您想要的数据位于script 标签内,您实际上可以在JSONloads 它然后parse 它。
  3. 之所以能够在驱动程序的inspect element 中看到elements,是因为浏览器实际上是为您可视化它,但是如果您检查了page source,您会发现它并没有与它一起定位如果您禁用了JS

这里我已经在JSON中加载了script,你可以通过JSONdict访问它

import requests
import json
import re

target = ["title", "itemDetailUrl", "imagePath"]


def main(url):
    r = requests.get(url)
    match = re.search(r'data: ({.+})', r.text).group(1)
    data = json.loads(match)
    goal = [data['pageModule'][x] for x in target] + \
        [data['priceModule']['formatedActivityPrice']]
    print(goal)


main("https://es.aliexpress.com/item/32601027783.html")

输出:

['Nueva versión Xiaomi Mi cargador de coche Dual USB versión de carga rápida 37W Max con puntas de luz LED para iPhone Huawei Xiaomi para Samsung|charger dual|dual usb|mi car - AliExpress', 
'https://es.aliexpress.com/item/32601027783.html', 
'https://ae01.alicdn.com/kf/H6f0b93e98bb646d5a1183161b65707e3P/Nueva-versi-n-Xiaomi-Mi-cargador-de-coche-Dual-USB-versi-n-de-carga-r-pida.jpg', 
'€ 9,31 - 10,86']

【讨论】:

  • 非常感谢,看来是这样;)
  • JS 仍然使用 REST API 节点,我们不能修补吗?
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多