Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Scrapy中将response.text转换为json

如何在Scrapy中将response.text转换为json
EN

Stack Overflow用户
提问于 2018-06-10 00:14:05
回答 3查看 2.8K关注 0票数 0

我正在使用Scrapy从下面的链接中抓取财务数据:

Financial Data from Tencent

reponse.body如下所示:

我尝试使用常规回归来拆分响应,然后将其转换为json,但它没有显示json对象,以下是我的代码:

代码语言:javascript
运行
AI代码解释
复制
import scrapy
import re
import json

class StocksSpider(scrapy.Spider):
    name = 'stocks'
    allowed_domains = ['web.ifzq.gtimg.cn']
    start_urls = ['http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_callback=jQuery11240339550$']

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url=url, callback=self.parse,
            #endpoint='render.json', # optional; default is render.html
            #splash_url='<url>',     # optional; overrides SPLASH_URL
            #slot_policy=scrapy_splash.SlotPolicy.PER_DOMAIN,  # optional
            )

    def parse(self, response):
        try:
            json_data = re.search('\{\"data\"\:(.+?)\}\}\]', response.text).group(1)
        except AttributeError:
            json_data = ''
        #print json_data
        loaded_json = json.loads(json_data)

        print loaded_json

它抛出一个错误,指出没有json对象可以解码:

代码语言:javascript
运行
AI代码解释
复制
    Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/scrapy/utils/defer.py", line 102, in iter_errback
    yield next(it)
  File "/usr/local/lib/python2.7/dist-packages/scrapy_splash/middleware.py", line 156, in process_spider_output
    for el in result:
  File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/offsite.py", line 30, in process_spider_output
    for x in result:
  File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/referer.py", line 339, in <genexpr>
    return (_set_referer(r) for r in result or ())
  File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "/usr/local/lib/python2.7/dist-packages/scrapy/spidermiddlewares/depth.py", line 58, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "/root/finance/finance/spiders/stocks.py", line 25, in parse
    loaded_json = json.loads(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
2018-06-09 23:54:26 [scrapy.core.engine] INFO: Closing spider (finished)

我的目标是将其转换为json,这样我就可以轻松地迭代内容。有必要将其转换为json吗?在这种情况下如何转换?响应是unicode格式的,所以我也需要将其转换为utf-8?有没有其他好的迭代方式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-10 00:56:26

问题似乎是实际的数据在jQuery1124033955090772971586_1528569153921()中。我可以通过删除请求url中的一个参数来摆脱它。如果你确实需要它,这可能会起到作用:

代码语言:javascript
运行
AI代码解释
复制
>>> import json
>>> url = 'http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_callback=jQuery1124033955090772971586_1528569153921&_=1528569153953'
>>> fetch(url)
2018-06-09 21:55:13 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_callback=jQuery1124033955090772971586_1528569153921&_=1528569153953> (referer: None)
>>> data = response.text.strip('jQuery1124033955090772971586_1528569153921()')
>>> parsed_data = json.loads(data)

如果您希望从url中删除_callback参数,只需:

代码语言:javascript
运行
AI代码解释
复制
>>> import json
>>> url = 'http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_=1528569153953'
>>> fetch(url)
2018-06-09 21:53:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_=1528569153953> (referer: None)
>>> parsed_data = json.loads(response.text)
票数 1
EN

Stack Overflow用户

发布于 2018-06-10 00:51:33

正如bla所说,没有&_callback=jQuery1124033955090772971586_1528569153921数据是有效的,回调是不需要的,也不是静态的,例如http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_callback=test是给出相同的结果

票数 1
EN

Stack Overflow用户

发布于 2018-06-10 03:11:17

代码语言:javascript
运行
AI代码解释
复制
import re
import scrapy


class StocksSpider(scrapy.Spider):
    name = 'stocks'
    allowed_domains = ['gtimg.cn']
    start_urls = ['http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_callback=jQuery1124033955090772971586_1528569153921&_=1528569153953']

    def parse(self, response):
        try:
            json = eval(re.findall(r'jQuery\d+_\d+(\(\{.+\}\))', response.body)[0])
            print json
        except:
            self.log('Response couldn\'t be parsed, seems like it is having different format')

使用eval而不是在json中进行转换,因为最后您将把它用作列表等的字典

可能是这样的,

代码语言:javascript
运行
AI代码解释
复制
import re
import scrapy


class StocksSpider(scrapy.Spider):
    name = 'stocks'
    allowed_domains = ['gtimg.cn']
    start_urls = ['http://web.ifzq.gtimg.cn/appstock/hk/HkInfo/getFinReport?type=3&reporttime_type=1&code=00001&startyear=1990&endyear=2016&_callback=jQuery1124033955090772971586_1528569153921&_=1528569153953']

    def parse(self, response):
        data = eval(re.findall(r'jQuery\d+_\d+(\(\{.+\}\))', response.body)[0])
        items = data.get('data', {}).get('data', [])

        for item in items:
            yield item

或者你可以使用json load代替eval,这也是可以的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50779567

复制
相关文章
使用Matplotlib制作动图
我们可以使用Matplotlib的animation模块的FuncAnimation类制作动画,你需要提供的只是一个动态更新变化数据的函数。 下面是一个最基本的例子:
卡尔曼和玻尔兹曼谁曼
2019/01/22
1K0
使用Matplotlib制作动图
Jupyter notebook最简原型界面设计 - ipywidgets与lineup_widget
Tkinter的GUI设计 和 django页面设计,那么笔者只是想快速做个demo原型,以上的内容能不能结合着来,有一些简单的交互 + web可以快速访问的到,于是就看到了jupyter notebook这两个库,非常简单的玩具,来看看呗~ ipywidgets比较强调输入项的各式花样,但是其对输出内容的格式的花样非常少。
悟乙己
2019/05/27
3.1K0
Jupyter Notebook已出现“返祖现象”,这款工具让你在终端里使用它
Jupyter Notebook,一般都是在网页上使用,可是你想过它有一天也可以在命令行中运行吗?
量子位
2021/05/11
7350
Jupyter Notebook已出现“返祖现象”,这款工具让你在终端里使用它
新编辑神器,可以在终端运行 Jupyter Notebook 了!
在我初学Python的时候,一直惯用着安装式的编辑器软件,比如PyCharm和Spyder。并且,一直以为编辑器都是这种形式的,有的区别只是体验和功能上的差异。
Python数据科学
2021/05/11
1.7K0
Python使用matplotlib画动态图
机器学习需要使用python实现相应的算法,因此学习了Matplotlib中的画图。
里克贝斯
2021/05/21
3.9K0
Python使用matplotlib画动态图
Python+matplotlib绘制动态更新的柱状图
问题描述:编写程序,生成测试数据,绘制水平柱状图,然后每隔0.5秒更新一次数据并实时根据最新数据绘制水平柱状图。
Python小屋屋主
2019/05/07
4.8K0
Python+matplotlib绘制动态更新的柱状图
新编辑神器,可以在终端运行 Jupyter Notebook 了!
在我初学Python的时候,一直惯用着安装式的编辑器软件,比如PyCharm和Spyder。并且,一直以为编辑器都是这种形式的,有的区别只是体验和功能上的差异。
崔庆才
2021/05/17
1.8K0
新编辑神器,可以在终端运行 Jupyter Notebook 了!
matplotlib 饼图
饼图用来显示展示数据的比例分布特征。matplotlib 中 使用 pie() 函数来绘制饼图。
用户6021899
2019/08/14
1.7K0
matplotlib 雷达图/蛛网图
第一个例子来自matplotlib官网,封装比较多,看起来有点复杂,但本质上是在极坐标系下画封闭的曲线图。
用户6021899
2019/08/14
2.1K0
使用交互组件(ipywidgets)“盘活”Jupyter Notebook(上)
传统上,每次需要修改笔记本单元格的输出时,都需要更改代码并重新运行受影响的单元格。这可能很繁琐、低效甚至容易出错,对于非技术用户来说,甚至是不切实际的。这就是ipywidgets发挥作用的地方:它们可以嵌入到笔记本中,并提供一个用户友好的界面来收集用户输入并查看更改对数据/结果的影响,而不必与代码交互;你的笔记本可以从静态文档转换为动态仪表盘——非常适合显示你的数据故事!
AiTechYun
2019/05/15
13.9K1
使用交互组件(ipywidgets)“盘活”Jupyter Notebook(上)
使用Matplotlib & Cartopy绘制我国台风路径图
之前在公众号做过一个关于我国1945~2015年历史台风统计的可视化展示,发现很多有趣的数据,比如说台风登陆最多的城市是湛江。
派大星的数据屋
2022/04/03
3.1K1
使用Matplotlib & Cartopy绘制我国台风路径图
matplotlib 误差棒图
matplotlib中使用errorbar()绘制误差棒图来表示被测量的误差范围。
用户6021899
2019/08/14
2K0
一图搞定Matplotlib!
今天给大家分享一位GitHub大神制作的Matplotlib cheat sheet,直接看图⬇️
统计学家
2020/05/20
4330
一图搞定Matplotlib!
【Python进阶】带你使用Matplotlib进行可视化
欢迎来到专栏《Python进阶》。在这个专栏中,我们会讲述Python的各种进阶操作,包括Python对文件、数据的处理,Python各种好用的库如NumPy、Scipy、Matplotlib、Pandas的使用等等。我们的初心就是带大家更好的掌握Python这门语言,让它能为我所用。
用户1508658
2019/08/06
1.3K0
matplotlib 常用图绘制
通过做图表来分析数据实在是一个非常棒的方法,由于我偶尔忘记语法,还得翻之前的笔记,难受。下面就画了些常用的图,记一记,记一记。
AngelNH
2020/04/16
9140
Matplotlib 气球图 制作
Matplotlib 制作稍带“艺术”的可视化作品,ggplot2 基于其优秀绘图图层设置及多种拓展绘图包可以较为灵活的完成此类任务,但Matplotlib也不是完全不可以,本期推文用python经典的绘图包Matplotlib进行“气球”图(通过图形合理搭配实现)的绘制,主要涉及Matplotlib 散点图(sactter())及 线 vlines()、mlines()及PatchCollection()等的灵活应用。上期推文预告的效果图在文末的代码链接(notebook)中 也会有绘制方法,本期推文为完善版本
DataCharm
2021/02/22
2.1K0
Matplotlib 气球图 制作
matplotlib基础:使用GridSpec自定义子图
指定绘制子图的网格形状,同时要设置绘制子图的行列数。当然也可以调整子图的布局(如 left,right等)。
bugsuse
2020/04/21
4.5K0
matplotlib基础:使用GridSpec自定义子图
你知道Jupyter notebook还可以用来做 “视频聊天室” 吗?
Ipywidgets在Jupyter生态系统中扮演着重要角色,它带来了用户和数据之间的互动。小工具组件是多种的Python对象,通常在Jupyter Notebook或JupyterLab中具有可视化表示:按钮,滑块,文本输入,复选框等。
Python数据科学
2018/12/17
2.1K0
你知道Jupyter notebook还可以用来做 “视频聊天室” 吗?
python matplotlib 动态图_matplotlib怎么读
默认情况下,在pycharm中用matplotlib绘制的图形在窗口内,是静态的:
全栈程序员站长
2022/09/27
1K0
python matplotlib 动态图_matplotlib怎么读
手把手教你使用Matplotlib绘制动图
本帖我们目的只有一个,复现下面视频展示的内容,即中国(上证)和美国(标普 500)2016 年 3 月到 2020 年 4 月的故事走势对比。先点开视频看一看,配着 Fort Minor 的 Remember the Name 的前奏真带感。
石晓文
2020/04/18
1.7K0

相似问题

未显示滑块(ipywidgets)

163

使用matplotlib中的滑块更新条形图

07

Python Matplotlib滑块小部件未更新

11

当滑块更新matplotlib时,图不刷新

116

让ipywidgets更新folium热图?

131
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档