Python(五)編程小實例


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的文本文件,你就可以打開查看你想看的小說了哦!加油吧,同學們!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM