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

Python爬虫与数据挖掘

共 3076字,需浏览 7分钟

 · 2022-03-16

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

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

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

大家好,我是Python进阶者。

一、前言

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

二、解决过程

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

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

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]。

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

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

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

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!

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

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】和【沈复】大佬给出的示例和代码支持,感谢粉丝【冫马讠成】积极参与学习交流。

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

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

往期精彩文章推荐:

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

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

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

/今日留言主题/

随便说一两句吧~

浏览 63
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报