Python爬取网易新闻评论实战:动态数据抓取与JSON处理
本文介绍使用Python爬取网易新闻评论的方法。针对动态加载的评论数据,通过开发者工具定位API接口,获取JSON格式数据。利用正则表达式剥离回调函数包裹,将JSON转换为Python字典后提取评论信息,并分别抓取热门与最新评论写入文件。
本文详细介绍使用Python实现网易新闻评论抓取的具体操作示例,供读者参考学习。
直接查看网易新闻页面的源代码,无法直接获取到所需的评论内容。
经过分析发现,页面源代码仅包含基础结构,而评论内容属于动态加载的数据。此时需要借助浏览器自带的开发人员工具,从网络请求加载的数据中定位并提取所需的评论信息。

图中圈出的部分标识了数据的类型。
在开发者工具中查看网络请求,发现返回的数据格式为JSON。尝试使用之前掌握的正则表达式或BeautifulSoup解析均遇到困难,于是深入研究正则表达式,发现将JSON格式的字符串转换为Python数据结构后,通过列表方式提取内容是一条可行的路径。
但在深入分析过程中,也发现了一些潜在问题。

在尝试获取每条评论时,发现数据存在嵌套情况。观察发现,当某条评论是对另一条评论的回复时,数据中会包含被回复评论的相关信息。因此,使用正则表达式对这部分数据进行专门提取处理。
最终的实现代码如下:
#coding=utf-8
__author__ = 'kongmengfan123'
import urllib
import re
import json
import time
def gethothtml(url):#最热评论
page=urllib.urlopen(url)
html=page.read()
get_json(html)
def gethnewtml():#最新评论有5页
for i in range(1,6):
url = 'http://comment.news.163.com/api/v1/products/a2869674571f77b5a0867c3d71db5856/threads/C4QFIJNS0001875O/comments/newList?offset=%d&limit=30&showLevelThreshold=72&headLimit=1&tailLimit=2&callback=getData&ibc=newspc&_=1478010624978'%i*30
page = urllib.urlopen(url)
html=page.read()
time.sleep(1)
get_json(html)
def get_json(json_):
end_=re.compile(r'\);')#将json网页转化成python数据
begain=re.compile(r'getData\(')
json_=begain.sub('',json_)
json_=end_.sub('',json_)
ajson=json.loads(json_)
lis=ajson["commentIds"]#获得每条评论的键
n=0
for i in range(1,len(lis)):
try:
xulie=re.compile('\d{10,}')#取得准确评论的键(去掉回复)
bia=re.findall(xulie,lis[n])
w.write(ajson['comments'][bia[len(bia)-1]]['user']['nickname'].encode('utf-8')+'|')
except KeyError:
w.write(ajson['comments'][bia[len(bia)-1]]['user']['location'].encode('utf-8')+'|')
if (len(lis[n])>13):
xulie=re.compile('\d{10,}')
bia=re.findall(xulie,lis[n])
w.write(ajson['comments'][bia[len(bia)-1]]['content'].encode('utf-8')+'\n')
else:
w.write(ajson['comments'][lis[n]]['content'].encode('utf-8')+'\n')
n=n+1
return lis
w=open('wangyi.txt','w')
w.write('用户名'+'|'+'热门评论'+'\n')
hot_=gethothtml('http://comment.news.163.com/api/v1/products/a2869674571f77b5a0867c3d71db5856/threads/C4QFIJNS0001875O/comments/hotList?offset=0&limit=40&showLevelThreshold=72&headLimit=1&tailLimit=2&callback=getData&ibc=newspc')
w.write('用户名'+'|'+'最新评论'+'\n')
gethnewtml()
w.close()
代码运行成功。
如需了解更多Python相关知识,可参考本站相关专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文提供的代码示例能对大家的Python编程实践有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













