大家好,我是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】提问,感谢【皮皮】、【瑜亮老师】、【