前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python网络爬虫过程中网页json格式数据存储你学会了嘛?

Python网络爬虫过程中网页json格式数据存储你学会了嘛?

作者头像
Python进阶者
发布2022-04-12 19:47:07
8600
发布2022-04-12 19:47:07
举报
文章被收录于专栏:Python爬虫与数据挖掘

大家好,我是Python进阶者。

一、前言

前几天在Python白银群有个叫【Rr】的粉丝问了一个关于Python网络爬虫过程中网页json格式数据存储的问题,这里拿出来给大家分享下,一起学习。

二、解决过程

她一开始将response的内容都写在txt文件了,存储的数据也不是json格式,看上去着实有点让人抓狂的感觉。

当然最后还是解决,这里给出【皮皮】和【月神】的代码,如下所示:

代码语言:javascript
复制
with open('Rr.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        # regex = re.compile('"summary":"(.*?)"', re.S)
        regex = re.compile('desc":"(.*?)","desc_module"', re.S)
        result = re.findall(regex, line)
        for item in result:
            print(item)

其实后来想起来,上次我和瑜亮老师给她看了这个网页,所以还是有点印象。我感觉她这么处理还是有点复杂了,不是说不好,确实可行,我只是觉得可以从网页上,直接reponse.json(),去取response['data']['desc'],之后直接存txt,一步到位,这样更推荐。这里额外加入一个小插曲,下次在群里问问题的时候,可以贴代码,不然挨个看你截图手敲,实在是让人头大。用【瑜亮老师】的话说:你的代码也不是军事机密,不用这么藏着掖着[doge][doge]。

下面一起来看看【瑜亮老师】给的代码吧。

代码语言:javascript
复制
import requests
import re
from bs4 import BeautifulSoup as bs

url = "https://scdn.gongyi.qq.com/json_data/data_detail/54/detail.37754.js"
resp = requests.get(url)
text = resp.text.replace('\\/', '/')
text = text.encode('utf-8').decode('unicode_escape')
regex = re.compile('"detail_top_img":null,"desc":"(.*?)","desc_module"', re.S)
result = re.findall(regex, text)
page = bs(result[0], "lxml")
print(page.text)

【瑜亮老师】只是在粉丝【Rr】的代码上做了简单的修改,但是起到的代码确实是立竿见影的,直接一步到位了。

后来还优化了一版代码,如下所示:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup as bs
import json

url = "https://scdn.gongyi.qq.com/json_data/data_detail/54/detail.37754.js"
resp = requests.get(url)
text = resp.text.replace('\\/', '/')
text = text.encode('utf-8').decode('unicode_escape')
page = bs(text, "lxml")
data = page.text.replace('_cb_fn_proj_37754(', '').replace(');', '')
json_data = json.loads(data)
print(json_data["detail"]["desc"])

这个是使用json提取的。结果是一样的,但是从代码复用的角度上,会更好一些。可以方便提取其他想要的字段,这个是导出来的json_data。话说回来,【瑜亮老师】一开始也不是那么顺利的,之前用json.loads之所报错,个人认为是因为源码中有类似这样的字段。< img src="http:\/\/p.qpic.cn\/gongyi\/748864bd25db5ee02a735eaad1c0fa2c013068bd5f3b273154f8aab95d4aae3f61f29b12d7211327\/500"\/>这里面有引号,会导致loads时候出现报错。

总之,不管用什么方法,只要处理掉这些字符,就可以使用json.loads,比方说这里.replace(');', '')需要剔除,json是类似字典结构的,结束的地方只能是 },不能有其他字符,不然会报错,json....decoder....balabala

你以为这就完事了?

No!

【月神】大佬发来一个秀代码,如下所示:

代码语言:javascript
复制
import requests
import json

resp = requests.get('https://scdn.gongyi.qq.com/json_data/data_detail/54/detail.37754.js')
text = resp.text
text = text[text.find('(') + 1: text.rfind(')')]
print(json.loads(text)['detail']['desc'])

这个代码中text = text[text.find('(') + 1: text.rfind(')')]这行代码比较难理解,实现的效果也是提取指定格式的内容。

运行效果如下图所示:

不过话说回来,长时间爬取还是加上headers好一点,不然爬虫也太高调了。P

三、总结

大家好,我是Python进阶者。这篇文章基于粉丝提问,针对Python网络爬虫过程中网页json数据提取的问题,给出了具体说明和演示,针对存储结果进行优化,给出了4个方法,顺利地帮助粉丝解决了问题!

最后感谢粉丝【Rr】提问,感谢【皮皮】、【瑜亮老师】、【🌑(这是月亮的背面)】、【dcpeng】和【沈复】大佬给出的示例和代码支持,感谢粉丝【冫马讠成】积极参与学习交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、解决过程
  • 三、总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档