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