學習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 url215 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 html21 except urllib2.URLError,e:22 if hasattr(e,'reason'):23 PRint u"連接失敗",e.reason24 return None25 #處理字符串,沒有處理干凈的可以再打開文件進行處理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 data38 #解析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.url145 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'%i56 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'%i72 time.sleep(6)73 74 75 js=JSON()76 js.parserJson()
新聞熱點
疑難解答