本次實戰項目適合,有一定Python語法知識的小白學員。本人也是根據一些網上的資料,自己摸索編寫的內容。有不明白的童鞋,歡迎提問。
目的:爬取百度小說吧中的原創小說《獵奇師》部分小說內容
鏈接:http://tieba.baidu.com/p/4792877734
首先,自己定義一個類,方便使用。其實類就像一個“水果籃”,這個“水果籃”里有很多的“水果”,也就是我們類里面定義的變量啊,函數啊等等,各種各樣的。每一種"水果"都有自己的獨特的口味,也即是各個函數實現的功能各不相同。
然后,按照這個思路,既然要爬取小說,那么肯定要有目標網頁的地址,也就是上面我給的那個連接。其實就像買水果之前,我們要找到水果店。
打開目標貼吧后,會發現里面有很多的貼子,有樓主發的,還有讀者評論的,很多很雜。不過,沒關系。度娘給了我們一個強大的功能,只看樓主。這就是我們的切入點。點擊只看樓主按鈕,哈哈,此時呈現在眼前的就是樓主的主要內容啦。
相應的,此時的網頁也有所改變,地址上多了一個只看樓主的標記 http://tieba.baidu.com/p/4792877734?see_lz=1
所以,我們在定義類中的初始化函數時,就要有這個標記。
接下來,我們開始在選擇不同口味的水果。我們要先獲取網頁的源代碼,就需要有一個getPage的函數。函數里需要有我們的頁碼,注意我們選擇不同也的小說,會發現,我們的地址也是有稍稍變動的,比如:第二頁連接:http://tieba.baidu.com/p/4792877734?see_lz=1&pn=2 多了&pn=2。這個我們要整合一下。
(未完>>>>>>>>>明晚繼續)
下面是我的代碼:
1 #-*- coding:utf-8 -*- 2 import urllib 3 import urllib2 4 import re 5 6 # 百度小說吧 原創小說《獵奇師》 7 # 連接http://tieba.baidu.com/p/4792877734?see_lz=1 8 # 第二頁連接:http://tieba.baidu.com/p/4792877734?see_lz=1&pn=2 9 class LQS: 10 def __init__(self,daseUrl,seeLZ): 11 self.daseUrl = daseUrl 12 self.seeLZ ='?see_lz=' + str(seeLZ) 13 # 傳入頁碼,獲取網頁源代碼 14 def getPage(self,pageNum): 15 try: 16 # 拼接,地址 + 樓主參數 + 頁數 17 url = self.daseUrl + self.seeLZ + '&pn=' + str(pageNum) 18 request = urllib2.Request(url) 19 response = urllib2.urlopen(request) 20 return response.read() 21 except Exception,e:# 處理異常 22 print e 23 # 獲取標題 24 def getTitle(self,pageNum): 25 html = self.getPage(pageNum) 26 reg = re.compile(r'<title>【原創】恐怖故事 (.*?)_小說吧_百度貼吧</title>') 27 items = re.findall(reg,html) 28 # 將標題寫入文件 29 for item in items: 30 f = open('lqshi.txt','w') # 文件名最好是英文,中文識別不了 31 f.write('標題' + '\t\t' + item) 32 f.close() 33 return items 34 # 獲取正文 35 def getContent(self,pageNum): 36 html = self.getPage(pageNum) 37 reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br>') 38 req = re.findall(reg,html) 39 # 將標題寫入文件 40 for i in req: 41 removeAddr = re.compile('<a.*?</a>') 42 i = re.sub(removeAddr,"",i)# 找到並替換 43 i = i.replace("<br>","\n ") 44 f = open('lqshi.txt','a')# 此處是寫入正文內容,所以用a 45 f.write( '\n\n\n' + i) 46 f.close() 47 return i 48 49 daseURL = 'http://tieba.baidu.com/p/4792877734' 50 lqShi = LQS(daseURL,1) 51 print "爬蟲已啟動..." 52 for i in range(4): 53 lqShi.getTitle(i) 54 lqShi.getContent(i) 55 print "正在抓取第%s頁的內容" % (i+1)