【问题标题】:Scraping json response using scrapy使用 scrapy 抓取 json 响应
【发布时间】:2017-07-04 11:46:19
【问题描述】:

JSON RESPONSE FROM WEBSITE 我是 python scrapy 和 json 的新手。我正在尝试从 78751 抓取 json 响应。但它显示错误。我使用的代码是

import scrapy
import json 
class BlackSpider(scrapy.Spider):
    name = 'black'
    start_urls = ['https://appworld.blackberry.com/cas/content/2360/reviews/2.17.2?page=1&pagesize=100&sortby=newest&callback=_content_2360_reviews_2_17_2&_=1499161778751']





    def parse(self, response):
         data = re.findall('(\{.+\})\);', response.body_as_unicode())
         a=json.loads(data[0])

         item = MyItem()
         item["Reviews"] = a["reviews"][4]["review"]           

         return item

它显示的错误是 ValueError("无法解码任何 JSON 对象")ERROR

【问题讨论】:

  • 看起来您的页面返回的是 HTML 内容而不是 JSON。通过 curl 检查它给我一个 html 文件,上面写着该站点正在维护中。
  • 它在这里工作让我添加网站的屏幕截图

标签: python json web-scraping scrapy


【解决方案1】:

您得到的响应是带有一些 json 的 javascript 函数:

_content_2360_reviews_2_17_2(\r\n{"some":"json"}]});\r\n

要从中提取数据,您可以使用简单的正则表达式解决方案:

import re
import json
data = re.findall('(\{.+\})\);', response.body_as_unicode())
json.loads(data[0])

它转换为:选择{} 之间以); 结尾的所有内容

编辑:我得到的结果:

{'platform': None,
 'reviews': [{'createdDate': '2017-07-04',
   'model': 'London',
   'nickname': 'aravind14-92362',
   'rating': 6,
   'review': 'Very bad ',
   'title': 'My WhatsApp no update '}],
 'totalReviews': 569909,
 'version': '2.17.2'}

【讨论】:

  • 补充:格式称为“JSONP”。它经常被用来(在 CORS 成为主流之前)绕过同源策略。
  • 我是新手,用正则表达式添加 json 响应的 url。
  • @emon 对不起,你能改写你的问题吗?
  • 为什么我放 item["Reviews"] = a["reviews"][4]["review"] 时显示错误
  • @emon,我还是很困惑。查看我的编辑,我可以通过data['reviews'][0]['review'] 成功获得审核。
猜你喜欢
  • 2013-08-12
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2022-08-04
相关资源
最近更新 更多