【问题标题】:Scraping JSON data from e-commerce Ajax site with Python使用 Python 从电子商务 Ajax 站点抓取 JSON 数据
【发布时间】: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 中。


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

  2. 还有一个问题是我多次运行代码后,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")

打印(页面内容)

【问题讨论】:

    标签: python json ajax beautifulsoup response


    【解决方案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()
      

      【讨论】:

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