使用 Python 从电子商务 Ajax 站点抓取 JSON 数据

Posted

技术标签:

【中文标题】使用 Python 从电子商务 Ajax 站点抓取 JSON 数据【英文标题】:Scraping JSON data from e-commerce Ajax site with Python 【发布时间】:2019-07-13 21:15:01 【问题描述】:

之前,我发布了一个关于如何从 AJAX 网站获取数据的问题,该网站来自此链接:Scraping AJAX e-commerce site using python

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


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

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


这里是网站链接:

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

这是我的代码

从 bs4 导入 BeautifulSoup 导入请求

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

page_response = requests.get(page_link, ti​​meout=5)

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

打印(页面内容)

【问题讨论】:

【参考方案1】:

您可以使用 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+jsonattr 由于似乎有几个<script>with这个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)

【讨论】:

感谢您的代码。有用。但是在运行相同的代码 3 次之后,它就不再工作了。这是否意味着该网站正在阻止我的IP? 如何防止ip阻塞?使用硒? 不知道是不是ip屏蔽,也不知道怎么防止 没关系,先生。还是谢谢你【参考方案2】:

您必须从您的Soup 手动解析来自 HTML 的数据,因为其他网站会限制他们的 json API 来自其他方。

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

【讨论】:

【参考方案3】:

试试:

import requests

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

【讨论】:

很抱歉,我几乎无法理解您的解决方案。你能帮我写代码吗?

以上是关于使用 Python 从电子商务 Ajax 站点抓取 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 从 Intranet 站点抓取 URL 数据?

从网站抓取电子邮件

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

使用 python 抓取具有无限滚动的站点

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

是否需要为它们所针对的每个站点编写爬虫程序?