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

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

八尺龙须方锦褥,已凉天气未寒时。

大家好,我是Python进阶者。

一、前言

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

二、解决过程

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

60435ad66949c4c8d4e87d037950ab28.png

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

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]。49a643dbb5fde9d6a80acd93e404d8f4.png

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

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】的代码上做了简单的修改,但是起到的代码确实是立竿见影的,直接一步到位了。

b4a2381916d244429aa07b2553a1cadd.png

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

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时候出现报错。

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

你以为这就完事了?

No!

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

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(')')]这行代码比较难理解,实现的效果也是提取指定格式的内容。

d8e3e1746873f8e7b10e88797c4fafb9.png运行效果如下图所示:

e646c21a3bc3e39cbc5945c631e570db.png

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

三、总结

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

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

8834f794af376f11294fb36756965c39.png

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

4f9fb02e29ab9d27355decd098856268.png

------------------- End -------------------

往期精彩文章推荐:

0c681cb7b8dac225c30f66aac33ecc04.png

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值