Python網路爬蟲:爬取古詩文中的某個制定詩句來實現搜尋

來源:互聯網
上載者:User

標籤:自己   正則表達   入門級   異常   分行符號   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網路爬蟲:爬取古詩文中的某個制定詩句來實現搜尋

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.