您的位置:首页 > 编程语言 > Python开发

python爬取网易评论

2015-12-09 20:08 621 查看
最近学习了json模块,并用它爬取了网易的评论。

爬取的是“最近华北空气污染严重”的新闻(http://comment.news.163.com/news3_bbs/B9MBB38O00014Q4P.html)

1、首先获取json格式的文件:我用的是360浏览器(貌似用谷歌比较好,但我谷歌出了点问题

所以用的360,不过没啥影响)

打开评论的网页,选取‘工具—开发人员工具’,或直接按F12,得到如下工具,点击Network,可以直接点 Scripts 得到 json 文件,一开始不知道评论是哪个文件。后来发现后缀名是 .html 的是评论网页。



2、网址:网易的评论有两种,一个是热门跟帖,一个是最新跟帖,两种帖子的网址不同,其中热门只有一个,而最新是多页的

#热门跟帖,也许它后面有个"_1",但若改成“_2”或更大时,它都长得一样但并不是评论! http://comment.news.163.com/data/news3_bbs/df/B9MBB38O00014Q4P_1.html #最新跟帖 http://comment.news.163.com/cache/newlist/news3_bbs/B9MBB38O00014Q4P_1.html</span>[/code] 所以要同时爬取两种网址。

3、处理字符串:用 json.loads() 解码字符串转换为python形式时格式很重要,在这里转换成字典形式。

将开头和结尾去掉,只剩下一个大字典,并去掉里面多余的信息

开头:



结尾:



这时候可以 printpost.keys() 试一下,可以得到字典中的键,在两种网址中,包含评论的键为:



接着获取这两个键里的值,可以得到每条帖子的信息:



接下来就可以获得评论了。

4、报错:socket.error: [Errno 10054],查了一下是远程主机重置了链接,是大量访问的原因,加了一个 time.sleep()就好了。

5、代码如下:

#coding=utf-8
import urllib2
import json
import re
import time
class WEPL:
def __init__(self):
self.user_agent = 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
self.headers = {'User_Agent' :self.user_agent}
self.url1='http://comment.news.163.com/data/news3_bbs/df/B9MBB38O00014Q4P_1.html'
def getPageIndex(self,pageIndex):
url2='http://comment.news.163.com/cache/newlist/news3_bbs/B9MBB38O00014Q4P_'+str(pageIndex)+'.html'
return url2
def getHtml(self,url):
try:
request=urllib2.Request(url,headers=self.headers)
response=urllib2.urlopen(request)
html=response.read()
return html
except urllib2.URLError,e:
if hasattr(e,'reason'):
print u'loading error',e.reason
return None
def getPost(self):
for i in range(1,10):
#两种网址分开处理
if i==1:
html=self.getHtml(self.url1)
data1=re.sub('^var replyData=','',html)
data2=data1[:-1]
else:
url2=self.getPageIndex(i)
html=self.getHtml(url2)
data1=re.sub('^var newPostList=','',html)
data2=data1[:-2]
data3=re.sub(" \[\<a href=''\>(.*?)\<\\\\/a\>\]: ","",data2)
data4=re.sub("\<span (.*?)\<\\\\/span\>","",data3)
data5=re.sub("\<br\>","",data4)
#将json文件解码为python格式
post=json.loads(data5)
if i==1:
for allvalue in post['hotPosts']:
with open('pl3.txt','a+') as fd:
fd.write(allvalue['1']['f'].encode('utf-8')+'('+'IP:')
fd.write(allvalue['1']['ip'].encode('utf-8')+')'+'\n'+'---')
fd.write(allvalue['1']['b'].encode('utf-8')+'\n')
else:
for allvalue in post['newPosts']:
with open('pl3.txt','a+') as fd:
fd.write(allvalue['1']['f'].encode('utf-8')+'('+'IP:')
fd.write(allvalue['1']['ip'].encode('utf-8')+')'+'\n'+'---')
fd.write(allvalue['1']['b'].encode('utf-8')+'\n')
#防止链接被重置
time.sleep(2)
spider=WEPL()
spider.getPost()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: