|
学习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(" \[<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()
|
|
|