1. 程式人生 > >Python網絡爬蟲:爬取古詩文中的某個制定詩句來實現搜索

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

它的 參考文獻 lis 實現 word self 適合 odi 級別

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 re
from urllib.request import urlopen
from urllib.erroe import HTTPError
from bs4 import BeautifulSoup

def getPage(url) :
    try :
        html = urlopen(url)
    except HTTPError as e :
        return None
    try :
        bsObj = BeautifulSoup(html)
    except AttributeError as e :
        return None
    return bsObj

def 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個字符,便得到了原詩的內容。

詩歌的單句以“。”, “!”, “?”結尾,故將詩句拆分成單句的正則表達式為 '(.*?[。!?])' , “.*?” 表示python正則中的非貪婪模式,[]內的內容表示任選其一,()則是為了找到匹配結果並存放。

得到單句以後只需要判斷”月”字是否在詩句中即可,有則輸出到result.txt 中,沒有則判斷下一句。

print ('---page', pg, 'dealed---') 在命令行裏輸出爬取的狀態,方便目測爬取的進度。


最後的結果是:

技術分享圖片

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