學習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()