使用 Python 从 e-commerce Ajax 站点抓取 JSON 数据

Scraping JSON data from e-commerce Ajax site with Python

之前,我发布了一个关于如何从来自 link 的 AJAX 网站获取数据的问题:

我对如何使用网络选项卡中的 chrome F12 获得响应有一些了解,并使用 python 进行一些编码以显示数据。但是我几乎找不到具体的 API url 。 JSON 数据不像以前的网站那样来自 URL,而是在 Chrome F12 的 Inspect Element 中。


  1. 我真正的问题实际上是如何使用 BeautifulSoup 或与之相关的任何东西来获得 仅 JSON 数据 ?在我只能从 application/id+json 中获取 JSON 数据之后,我会将其转换为 python 可以识别的 JSON 数据,以便我可以将产品显示成table形式。

  2. 还有一个问题是我运行代码几次后,JSON数据丢失了。我认为该网站会屏蔽我的 IP 地址。我该如何解决这个问题?


这是网站link:

https://www.lazada.com.my/catalog/?_keyori=ss&from=input&page=1&q=h370m&sort=priceasc

这是我的代码

from bs4 import BeautifulSoup import requests

page_link = 'https://www.lazada.com.my/catalog/?_keyori=ss&from=input&page=1&q=h370m&sort=priceasc'

page_response = requests.get(page_link, timeout=5)

page_content = BeautifulSoup(page_response.content, "html.parser")

print(page_content)

尝试:

import requests

response = requests.get(url)
data = response.json()

您将不得不从您的 Soup 手动解析来自 HTML 的数据,因为其他网站会限制来自其他方的 json API

您可以在此处的文档中找到更多详细信息: https://www.crummy.com/software/BeautifulSoup/bs4/doc/

你可以只使用 find 方法和指向你的 <script> 标签的指针和 attr type=application/json

然后你可以使用json包来加载字典中的值

这是一个代码示例:

from bs4 import BeautifulSoup as soup
import requests
import json

page_link = 'https://www.lazada.com.my/catalog/?_keyori=ss&from=input&page=1&q=h370m&sort=priceasc'
page_response = requests.get(page_link, timeout=5)
page_content = soup(page_response.text, "html.parser")

json_tag = page_content.find('script',{'type':'application/json'})
json_text = json_tag.get_text()
json_dict = json.loads(json_text)
print(json_dict)

编辑: 不好意思,我没看到你搜索 type=application/ld+json attr 由于它似乎有几个 <script>with this attr,你可以简单地使用 find_all 方法:

from bs4 import BeautifulSoup as soup
import requests
import json

page_link = 'https://www.lazada.com.my/catalog/?_keyori=ss&from=input&page=1&q=h370m&sort=priceasc'
page_response = requests.get(page_link, timeout=5)
page_content = soup(page_response.text, "html.parser")

json_tags = page_content.find_all('script',{'type':'application/ld+json'})
for jtag in json_tags:
    json_text = jtag.get_text()
    json_dict = json.loads(json_text)
    print(json_dict)