python爬取网易评论


学习python不久,最近爬的网页都是直接源代码中直接就有的,看到网易新闻的评论时,发现评论时以json格式加载的.....

爬的网页是习大大2015访英的评论页http://comment.news.163.com/news_guonei8_bbs/SPEC0001B60046CG.html

步骤如下:

1.使用谷歌浏览器分析网页首页加载的数据

 打开网页----按下F12----点击Network,此时是空的

刷新以后,会出现如下图:(我以前加载过页面,所以json数据显示的不全)

点击其中的一个json格式的文件,找到url,并在网页中打开,看看是不是自己想要的数据:

我第一次访问网页的时候打了三个,只有一个是并论的内容,首页的网址为:

http://comment.news.163.com/data/news_guonei8_bbs/df/SPEC0001B60046CG_1.html?_=14455959217790 

数据为:

2.其他评论页

在点击其他评论页时,先点击一下Network中的清除按钮,方便查找json---从第二页开始观察,几乎都一样

点击找到url,并在浏览器中打开

数据虽然是乱码的,在Python中读取到的是可以正常查看的

 

3.网址规律

一开始以为网址后面的有什么规律,后来发现去掉也没影响,

所以只要把页数换成对应的评论页就好了(我只能打开34页??)

4.代码

注:由于数据开始有变量名,结尾有分号,在使用json.loads(data)时报错,所以先对数据进行处理

 1 # encoding=utf-8
 2 
 3 import urllib2
 4 import json
 5 import re
 6 import time
 7 class JSON():
 8     def __init__(self):
 9         self.user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
10         self.headers={'User-Agent':self.user_agent}
11         self.url1='http://comment.news.163.com/data/news_guonei8_bbs/df/SPEC0001B60046CG_1.html'
12     def getUrls(self,pageIndex):
13         url2='http://comment.news.163.com/cache/newlist/news_guonei8_bbs/SPEC0001B60046CG_'+str(pageIndex)+'.html'
14         return url2
15     def getHtml(self,url):
16         try:
17             request=urllib2.Request(url,headers=self.headers)
18             respone=urllib2.urlopen(request)
19             html=respone.read()
20             return html
21         except urllib2.URLError,e:
22             if hasattr(e,'reason'):
23                 print u"连接失败",e.reason
24                 return  None
25     #处理字符串,没有处理干净的可以再打开文件进行处理
26     def strDeal(self,data,pageIndex):
27         if pageIndex==1:
28             data=data.replace('var replyData=','')
29         else:
30             data=data.replace('var newPostList=','')
31         reg=re.compile("&nbsp;\[<a href=''>")
32         data=reg.sub('--',data)
33         reg2=re.compile('<\\\/a>\]')#<\/a>]的正则?
34         data=reg2.sub('',data)
35         reg3=re.compile('<br>')
36         data=reg3.sub('',data)
37         return data
38     #解析json数据并存入文件
39     def parserJson(self):
40         with open('wangyi2.txt','a') as f:
41             f.write('用户ID'+'|'+'评论'+'|'+'点赞数'+'\n')
42         for i in range(1,35):
43             if i==1:
44                 url=self.url1
45                 data=self.getHtml(url)
46                 data=self.strDeal(data,i)[:-1]
47                 value=json.loads(data)
48                 f=open('wangyi2.txt','a')
49 
50                 for item in value['hotPosts']:
51                     f.write(item['1']['f'].encode('utf-8')+'|')
52                     f.write(item['1']['b'].encode('utf-8')+'|')
53                     f.write(item['1']['v'].encode('utf-8')+'\n')
54                 f.close()
55                 print 'sleeping pageload %d/34'%i
56                 time.sleep(6)
57             else:
58                 url=self.getUrls(i)
59                 data=self.getHtml(url)
60                 data=self.strDeal(data,i)[:-2]
61                 # 转换,一开始得到的数据类型为str,使用json.loads()函数,得到原始数据,此时的value的数据类型为dict,接下来就可以正常访问字典了。
62                 value=json.loads(data)
63                 f=open('wangyi2.txt','a')
64 
65                 for item in value['newPosts']:
66                     f.write(item['1']['f'].encode('utf-8')+'|')
67                     f.write(item['1']['b'].encode('utf-8')+'|')
68                     f.write(item['1']['v'].encode('utf-8')+'\n')
69 
70                 f.close()
71                 print 'sleeping pageload %d/34'%i
72                 time.sleep(6)
73 
74 
75 js=JSON()
76 js.parserJson()

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM