Python爬⾍实战:爬取优酷电影《哪吒》的所有评论内容及⽤户信息。这⾥以优酷《哪吒》的⽤户评论为⽬标
⼤家应该都翻过电影评论,随着往下翻越来越多的评论逐个加载出来,页⾯⽆需刷新。所以这是典型的AJAX⽹页
先上代码
import requests
import json
import re
# 构建评论列表的URL,接下来⽤以得到杰森格式的评论内容
comment_url = "uku/ycp/comment/pc/commentList?jsoncallback=n_commentList&\
app=100-DDwODVkv&objectId=1097963004&objectType=1&listType=0¤t\
Page={}&pageSize=30&sign=8fc6ac73638d4f0263358f1ae323489b&time=1572784759".format(input("请输⼊,来获取本页的评论:"))
# 得到json数据
head ={"User-Agent": "Mozilla/5.0(Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36(KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"}
html = (comment_url, headers=head).text
html_json = re.findall("n_commentList(.*)", html, re.S)[0].strip(")").replace("(","")
print(len(html_json))
# 转化为json后,通过debug调试,发现是⼀个由列表和字典混合组成多层嵌套的字典,需要层层挖掘信息
json_content = json.loads(html_json)
content_data = json_content["data"]
comment_data = content_data["comment"]
number =1
for each_comment in comment_data:
print("第{}条评论\n".format(number),"账号:", each_comment["userId"])
print("⽤户名:", each_comment["user"]["userName"])
if len(each_comment["user"]["vipInfo"])==0:
print("VIP等级:⾮会员")
else:
print("VIP等级:", each_comment["user"]["vipInfo"]["name"])
print("评论内容:".format(number), each_comment["content"],"\n","--"*25)
number +=1
过程:
⾸先在电影页⾯往下滑,评论将会加载
的确在源代码中我们可以看到⽤户评论,但是⽤户信息将⽆能为⼒
这⾥我使⽤Chrome浏览器,监控network的变化我们⾸先要到:
没错,就是评论列表,comment是评论的意思
接着我们在新页⾯中打开他的URL
可以看出来,这是⼀个json格式
通过对⽐多个页⾯的URL,发现他们并没有很⼤的差别,只有页数产⽣了变化,如我的代码中使⽤format来加⼊页码。
在处理这段json时有个坑
报错信息如下:
"""raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)"""
最终原因折磨了我好久,是因为这段json被⼀组不易察觉的圆括号包裹了,⽽这会导致⽆法解码
⼀开始我是这样写的 :
python新手代码userid⾮贪⼼算法
re.findall("n_commentList(.*?)", html, re.S)
实际上这样什么也提取不出来
⾸先这⾥的括号并不会作为标识元素,也就是说你提取的⽂本依然会有括号
其次⾮贪⼼算法将会提取最短字符串,⽽且本段⽂本⼜是以")"为结尾,所以提取公式中将会没有结尾,那么⾮贪⼼算法什么也不会提取作如下修改
re.findall("n_commentList(.*)", html, re.S)[0].strip(")").replace("(","")
终于可以成功转换为json ⽤户信息⼀览⽆余:
每⼀条展开都很复杂

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。