Python(五)編程小實例
抓取網頁信息,並生成txt文件內容!
Python抓取網頁技能——Python抓取網頁就是我們常看見的網絡爬蟲,我們今天所要用到的就是我們Python中自帶的模塊,用這些模塊將網頁內容爬取下來,並生成一個txt文件。
(一)實例思路:
我們所需要用到的模塊:
urllib2—urllib2是Python的一個獲取URLs(Uniform Resource Locators)的組件。他以urlopen函數的形式提供了一個非常簡單的接口,這是具有利用不同協議獲取URLs的能力,他同樣提供了一個比較復雜的接口來處理一般情況,例如:基礎驗證,cookies,代理和其他。
1 import urllib2 2 3 response=urllib2.urlopen('http://tieba.baidu.com/p/4923127538?see_lz=1') 4 5 html = response.read()
re—Python的re模塊就是我們開始想知道的大名鼎鼎的正則表達式,正則表達式(可以稱為REs,regex,regex pattens)是一個小巧的,高度專業化的編程語言,它內嵌於Python開發語言中,可通過re模塊使用。正則表達式的pattern可以被編譯成一系列的字節碼,然后用C編寫的引擎執行。
1 import re 2 3 m = re.search ('ab+','asdfabbbbb') 4 5 print m.group()
1 Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32 2 Type "copyright", "credits" or "license()" for more information. 3 >>> 4 ========================= RESTART: H:\Python27\1.py ========================= 5 abbbbb 6 >>>
re—正則表達式我們本節就不去重點講了,基礎同學們可以去看看正則表達式的詳細內容:http://www.runoob.com/python/python-reg-expressions.html。在我的博客中有詳細的正則表達式(字符)詳解!
那么接下來我們開始我們的小實例——爬取百度貼吧小說!
首先我們要明確一下我們項目的思路:
# -*- coding: utf-8 -*-
#模塊:urllib2, re。
#正則表達式:------想要的內容 findall(正則表達式,源碼)
#百度貼吧爬取內容:1.獲取源碼
# 2.解析超鏈接
# 3.獲取標題
# 4.獲取內容
# 5.發送命令,調用主函數
我們在進行項目時要將整體突出程序化,那么我們開始第一步的實施調取Python中自帶的模塊:
1 # -*- coding: utf-8 -*- 2 3 import urllib2 4 import re
將我們所需的模塊插入后,我們開始項目的實施:
1 class BDTB: 2 baseUrl = 'http://tieba.baidu.com/p/4923127538?see_lz=1' 3 #獲取源代碼 4 def getPage(self,pageNum): 5 try: 6 url = self.baseUrl + str(pageNum) 7 request = urllib2.Request(url) 8 response = urllib2.urlopen(request).read() 9 #print response 10 return response 11 except Exception,e: 12 print e
上述代碼是我們要獲取的網頁源碼信息,因為我們需要多方面的爬取我們想要的內容,所以我們創建一個類來實現其中所有函數的功能。
1 baseUrl = 'http://tieba.baidu.com/p/4923127538?see_lz=1'
baseUrl就是我們想要獲取的網址!
1 def getPage(self,pageNum): 2 try: 3 url = self.baseUrl + str(pageNum) 4 request = urllib2.Request(url) 5 response = urllib2.urlopen(request).read() 6 #print response 7 return response 8 except Exception,e: 9 print e
網址獲取到了之后,我們要定義一個函數,來獲取我們想要獲取的網頁信息,在函數中我們定義了兩個變量,這兩個變量是我們正則匹配時要需要用到的!
我們在其中所用到的:
1 try: 2 語句1 3 語句2 4 . 5 . 6 語句N 7 except Exception e: 8 print e
這樣的語句就是判斷我們的程序有沒有錯誤,看我們是否獲取到我們想要的信息,如果沒有獲取到就給編譯器返回一個e值!
接下來我們要使用我們的正則表達式來獲取其中我們想要的內容了!
1 def Title(self,pageNum): 2 html = self.getPage(pageNum) 3 reg = re.compile(r'title="這(.*?)"') 4 items = re.findall(reg,html) 5 print items[0] 6 for item in items: 7 f = open('text1.txt','w') 8 f.write('標題'+'\t'+item) 9 f.close() 10 return items
這一段定義的函數是將我們所獲取到的網頁信息,匹配到我們想要的位置,然后截取下來!並且將網頁匹配的信息生成一個text1.txt的文本文件,‘w’就是寫入信息!
1 reg = re.compile(r'title="這(.*?)"')
這里我們就用到了re模塊中的包含一個重要函數是compile(pattern [, flags]) ,該函數根據包含的正則表達式的字符串創建模式對象。
參數描述:
pattern匹配的正則表達式string要匹配的字符串。
flags標志位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
1 >>> import re 2 >>> repp = 'a,b,,,,c d' 3 >>> reOB = re.compile('[, ]+') 4 >>> reOB.split(some_text) 5 ['a', 'b', 'c', 'd']
接下來我們再看另一個re模塊中的函數python 正則表達式 re findall 方法能夠以列表的形式返回能匹配的子串。
re.findall(pattern, string[, flags]):
1 items = re.findall(reg,html)
我們來看一下這個函數的實例:
1 >>> import re 2 >>> p = re.compile(r'\d+') 3 >>> print p.findall('one1two2three3four4') 4 ['1', '2', '3', '4'] 5 >>>
將我們我所要查詢到的數字以列表的形式輸出出來!
1 for item in items: 2 f = open('text1.txt','w') 3 f.write('標題'+'\t'+item) 4 f.close()
在這段代碼中,我們用到了Python文件寫入,這個地方就是生成我們txt文本文件的地方,同學門可以找找詳細的資料來研究一下,這里是對於想保存長期看的同學有很大的幫助哦!在這里我就不詳細講解了!
我們繼續我們的項目:
1 def Text(self,pageNum): 2 html = self.getPage(pageNum) 3 reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br> ',re.S) 4 req = re.findall(reg,html) 5 #print req[0] 6 for i in req: 7 removeAddr = re.compile('<a.*?>|</a>') 8 removeaddr = re.compile('<img.*?>') 9 removeadd = re.compile('http.*?.html') 10 i = re.sub(removeAddr,'',i) 11 i = re.sub(removeaddr,'',i) 12 i = re.sub(removeadd,'',i) 13 i = i.replace('<br>','') 14 print i 15 f = open('text1.txt','a') 16 f.write('\n\n'+i) 17 f.close()
此處的代碼就是我們要完成我們真正所需要的內容了,這里是完整的將我們所需要的小說爬取到手的,這里面用的正則匹配就是我們的貪婪匹配模式了!
1 def Text(self,pageNum): 2 html = self.getPage(pageNum) 3 reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br> ',re.S) 4 req = re.findall(reg,html)
那么這一部分還是我們在上一匹配到的內容中,將class標簽中的全部文字內容提取出來,但是其中我們會看到包含了很多img http等很多小標簽,所以我們還需要將這些內容利用正則匹配中的sub函數將他們裝換為空“ ”!
1 for i in req: 2 removeAddr = re.compile('<a.*?>|</a>') 3 removeaddr = re.compile('<img.*?>') 4 removeadd = re.compile('http.*?.html') 5 i = re.sub(removeAddr,'',i) 6 i = re.sub(removeaddr,'',i) 7 i = re.sub(removeadd,'',i) 8 i = i.replace('<br>','') 9 print i
這一串代碼就是我們想要把其中像re.compile('<a.*?>|</a>')這樣的內容獲取到,然后再利用我們的sub函數將這些獲取到的內容裝換為“ ”空白!然后在輸出到 i 這個列表中!最后將 i 輸出!
我們在結尾處需要做一個程序運行無誤的判斷,那么我們就需要用到在編譯器中給我們返回我們程序運行的開始!文件的生成結果:
1 bdtb = BDTB() 2 print '爬蟲正在啟動.....' 3 try: 4 for i in range(1,4): 5 print '正在爬取第%s小說' %(i) 6 bdtb.Title(1) 7 bdtb.Text(1) 8 except Exception,e: 9 print e
在這里我們要調用我們所創建的類,在這一個try中我們看到了一個range的函數,這個函數就是如果你需要一個數值序列,使用內建函數range() 會很方便,它產生等差級數序列。利用這個函數的意思就是我們要獲取小說的全部內容!最后我們生成一個text1.txt的文件
最后附上我們實現的整體代碼:
1 # -*- coding: utf-8 -*- 2 3 import urllib2 4 import re 5 6 class BDTB: 7 baseUrl = 'http://tieba.baidu.com/p/4923127538?see_lz=1' 8 #獲取源代碼 9 def getPage(self,pageNum): 10 try: 11 url = self.baseUrl + str(pageNum) 12 request = urllib2.Request(url) 13 response = urllib2.urlopen(request).read() 14 #print response 15 return response 16 except Exception,e: 17 print e 18 #匹配內容 19 def Title(self,pageNum): 20 html = self.getPage(pageNum) 21 reg = re.compile(r'title="這(.*?)"') 22 items = re.findall(reg,html) 23 print items[0] 24 for item in items: 25 f = open('text1.txt','w') 26 f.write('標題'+'\t'+item) 27 f.close() 28 return items 29 def Text(self,pageNum): 30 html = self.getPage(pageNum) 31 reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br> ',re.S) 32 req = re.findall(reg,html) 33 #print req[0] 34 for i in req: 35 removeAddr = re.compile('<a.*?>|</a>') 36 removeaddr = re.compile('<img.*?>') 37 removeadd = re.compile('http.*?.html') 38 i = re.sub(removeAddr,'',i) 39 i = re.sub(removeaddr,'',i) 40 i = re.sub(removeadd,'',i) 41 i = i.replace('<br>','') 42 print i 43 f = open('text1.txt','a') 44 f.write('\n\n'+i) 45 f.close() 46 47 48 49 bdtb = BDTB() 50 print '爬蟲正在啟動。。。。' 51 try: 52 for i in range(1,4): 53 print '正在爬取第%s小說' %(i) 54 bdtb.Title(1) 55 bdtb.Text(1) 56 except Exception,e: 57 print e
運行后,在你的Pyhton文件中會生成一個text1.txt的文本文件,你就可以打開查看你想看的小說了哦!加油吧,同學們!