標籤:自己 正則表達 入門級 異常 分行符號 Regex 網路數 搜尋 pip3
python編譯練習,為了將自己學習過的知識用上,自己找了很多資料。所以想做一個簡單的爬蟲,代碼不會超過60行。主要用於爬取的古詩文網站沒有什麼限制而且網頁排布很規律,沒有什麼特別的東西,適合入門層級的爬蟲。
抓取目標網站的準備工作
Python的版本是:3.4.3.
爬取的目標是: 古詩文網(www.xzslx.net)
隨意開啟一個古詩文網的古詩頁面,查看它的網頁地址就能看到,古詩的地址基本是 “www.xzslx.net/shi/+ id + .html” 構成,如:
然後對古詩文網的古詩總覽頁面可以看到分頁符 最下方:
總共包括29830篇古詩文可以抓取,確定了”/shi/”後面數位範圍。
html頁面解析庫:BeautifulSoup
安裝方式是: $pip3 install BeautifulSoup4
主要參考文獻:《python網路資料擷取》第一、二章
代碼解析:
#!usr/bin/python3# -*- coding:utf-8 -*-import refrom urllib.request import urlopenfrom urllib.erroe import HTTPErrorfrom bs4 import BeautifulSoupdef getPage(url) : try : html = urlopen(url) except HTTPError as e : return None try : bsObj = BeautifulSoup(html) except AttributeError as e : return None return bsObjdef getUrl(pg) : return ''.join(('http://www.xzslx.net/shi/', str(pg),'.html'))f = open('./result.txt', 'wt')for pg in range(0, 49149) : html = getPage(getUrl(pg)) cont = (html.findAll('div', {'class' : 'son2'})) if cont != None and len(cont) > 1 : cont = cont[1].get_text() poem = cont[cont.find('原文:') + 4:] sentList = re.findall(r'(.*?[。!?])', poem) for sentc in sentList : if '月' in sentc : print (sentc, '\t--- <', html.find('h1').get_text(), '>', file = f) print ('--- page', pg, ' dealed ---')
getPage(url) 函數的主要參考請看《python網路資料擷取》第9頁裡面的代碼。採用try...catch...防止採集的頁面是發生異常而導致爬蟲終止。
getUrl(pg) 函數主要是方便url的組成,瞭解join()函數是python的基礎,很簡單不用細說。
open() 函數用於開啟文檔,這裡我開啟一個 result.txt 的文檔存放爬取的結果。
名為html的變數代表的是一個通過getPage()函數擷取的BeautifulSoup對象,觀察原頁面可發現詩歌內容存放在一個屬性“class = ‘son2’”的div內,而且是html文檔中第二個這樣的標籤(第一個這樣的標籤是搜尋方塊)。
使用get_text()函數擷取<div class = 'son2'> 的文字內容,整首詩存放在“原文:”的後面,故在所獲的內容中找到”原文:”的位置並向後位移3個位置加一個分行符號總共4個字元,便得到了原詩的內容。
詩歌的單句以“。”, “!”, “?”結尾,故將詩句拆分成單句的Regex為 '(.*?[。!?])' , “.*?” 表示python正則中的非貪婪模式,[]內的內容表示任選其一,()則是為了找到匹配結果並存放。
得到單句以後只需要判斷”月”字是否在詩句中即可,有則輸出到result.txt 中,沒有則判斷下一句。
print ('---page', pg, 'dealed---') 在命令列裡輸出爬取的狀態,方便目測爬取的進度。
最後的結果是:
Python網路爬蟲:爬取古詩文中的某個制定詩句來實現搜尋