據說這樣學習古詩詞纔是正確的!



 一文帶你爬取傳統古詩詞(超級簡單!)

目錄

  • 1、小小課堂html

  • 2、網頁分析python

    • 2.7.1 拼接URLnginx

    • 2.7.2 內容解析bash

    • 1. xpath解析微信

    • 2. 代碼實現網絡

    • 3. 運行結果app

    • 2.1 肯定要爬取的內容對應的urldom

    • 2.2 分析抓取的主要內容工具

    • 2.3 獲取全部的一級類型(錯誤版本)學習

    • 2.4 獲取全部的一級類型(修改版本)

    • 2.5 獲取二級標題

    • 2.6 獲取二級類型下詩詞的名稱和url

    • 2.7 查詢數據

  • 3、完整代碼

  • 4、保存結果


1、小小課堂


中國文學源遠流長,早在遠古時代,雖然文字尚未產生,但在人民中間已經流傳着神話傳說和民間歌謠等口頭文學。隨着時間線的推移,前後出現了:詩經(西周)——楚辭(戰國)——樂府(漢)——賦(晉)——唐詩——宋詞——元曲——明清小說。

如今一提,不知各位想到的是什麼。可是本人首先想到的詩歌是《阿房宮賦》、《水調歌頭·明月幾時有》、《念奴嬌·赤壁懷古》、《茅屋爲秋風所破歌》等等。多是由於這些個別的詩歌賊長,在高中時期折磨過個人緣由吧-。-

如今有一個新的職業——網絡文學做家,他們寫小說發佈在網上,經過其有趣的故事情節及其豐富的主分線並行等特色吸引大批做者,從而達到掙錢的目的。可是,不知你知道與否,早在我國古代的明清時期,白話小說就已經蓬勃發展了。在那是,出現了「章回體小說」。一提到「章回體小說」,咱們就不得不提到四大名著。名著之因此可以成爲名著,是與其特色分不開的。它們的特色是分回標目,常取一個或兩個中心事件爲一回,每回篇幅大體相等,情節先後銜接,開頭、結尾經常使用「話說」「且聽下回分解」等口頭語,中間穿插詩詞韻文,結尾故設懸念吸引讀者。除了四大名著以外,還有博主最喜歡的兩本書:《儒林外史》、《聊齋志異》。哈哈,博主在此聲明,我不是推銷小說的啊。只是單純的有感而發而已。若是各位想要看看博主推薦的書的話,也是能夠的。總之你看了也沒有任何壞處。

我國古典文學如此之多,在整個世界上也是實屬罕見的。那麼,做爲新世紀國家的創造者,咱們因該的作的就是傳承好古典文學。古爲今用,弘揚社會主義價值觀,好讓中國文學可以繼續更好的繼承下去。

如今因該會有讀者會說,改進入正題了。🆗,從如今開始進入正題。

上面說了那麼多,雖然看似與本文無關,可是實際上是有關係的。想象一下,既然咱們要更多的品味古典文學,咱們是否是要專門的查看借鑑。可是又因爲如今咱們的時間都是零碎化的時間快,單獨看書又不太現實。現現在網絡如此之發達,咱們每一個人基本上都已經離不開電腦、手機了。那麼咱們可不能夠經過Python爬蟲的方式,把這些內容全不爬取出來,而後經過電子設備進行閱讀呢?


下面就開始實現此設想。

2、網頁分析

從理想到現實的第一步,固然是先找到網站了。

古詩文網:https://www.gushiwen.org/

咱們打開網址以後,發現網頁以下:

2.1 肯定要爬取的內容對應的url

咱們先查看網頁的結構

 1. 先點擊更多 查看多有的類型

2. 咱們能夠看到下圖已經把全部的類型顯示出來

3. 經過開發者選項肯定起始URL

經過查看,咱們能夠斷定咱們的起始URL爲:https://so.gushiwen.cn/shiwen/

代碼:

start_url = "https://so.gushiwen.cn/shiwen/"base_url = "https://so.gushiwen.cn"

2.2 分析抓取的主要內容


根據上述兩圖咱們先肯定爬取的內容:一級類型,二級類型,詩詞名稱,詩詞做者,詩詞內容,詩詞譯文及註釋

2.3 獲取全部的一級類型(錯誤版本)

1.分析

2. 嘗試xpath解析

3.代碼實現

import requestsfrom lxml import etree
start_url = "https://so.gushiwen.cn/shiwen/"base_url = "https://so.gushiwen.cn"
headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",}
items = []

def parse_url(url): """解析url,獲得響應內容""" # time.sleep(random.random()) response = requests.get(url=url, headers=headers) return response.content.decode("utf-8")

def parse_html(html): """使用xpath解析html,返回xpath對象""" etree_obj = etree.HTML(html) return etree_obj

html = parse_url(start_url)etree_obj = parse_html(html)first_type_name_list = etree_obj.xpath('//div[@class="cont"]/a/text()')first_type_url_list = etree_obj.xpath('//div[@class="cont"]/a/@href')print(first_type_name_list)print(first_type_url_list)


 4. 結果

不知道,同窗們有沒有發現此處有問題呢?

2.4 獲取全部的一級類型(修改版本)

咱們上述的解析式實際上是有問題的,它是吧全部的包括做者也解析出來了,看下圖:

正確的寫法是這樣的

first_type_name_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/text()')first_type_url_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/@href')

2.5 獲取二級標題

1. 解析

 2. 代碼

 #二級類型類型數據div for div in div_list: #二級類型名稱 second_type_name = div.xpath(".//strong/text()") if second_type_name: # 有的沒有二級類型 second_type_name = second_type_name[0] else: second_type_name = "" print(second_type_name)

3. 結果

2.6 獲取二級類型下詩詞的名稱和url

 1. xpath解析

2. 代碼

 #二級類型下詩詞的名稱和url poetry_name_list = div.xpath(".//span/a/text()") poetry_url_list = div.xpath(".//span/a/@href") data_zip = zip(poetry_name_list,poetry_url_list)

2.7 查詢數據

2.7.1 拼接URL

1. 拼接一級標題的URL

查詢數據的話,首先咱們先拼接一級URL


 #一級類型url url = base_url + first_type["url"] print(url) first_type_name = first_type["name"] print(first_type_name)

2. 拼接二級標題的URL


 for data in data_zip: #item是一個詩詞數據 item = {} item["first_type_name"] = first_type_name item["second_type_name"] = second_type_name item["poetry_name"] = data[0] #詩詞url poetry_url = base_url+data[1] print(poetry_url)

2.7.2 內容解析

1. xpath解析

 1.詩詞名稱

 2.詩詞做者

3.詩詞內容

4.詩詞譯文及註釋

2. 代碼實現

 #詩詞做者 poetry_author = etree_obj.xpath('//p[@class="source"]')[0].xpath(".//text()") item["poetry_author"] = "".join(poetry_author).strip() #詩詞內容 poetry_content = etree_obj.xpath('//*[@id="contson45c396367f59"]/text()') item["poetry_content"] = "".join(poetry_content).strip() #詩詞譯文和註釋 if etree_obj.xpath('//div[@class="contyishang"]'):#有的沒有註釋 poetry_explain = etree_obj.xpath('//div[@class="contyishang"]')[0].xpath(".//text()") item["poetry_explain"] = "".join(poetry_explain).strip() else: item["poetry_explain"] = "" print(item)



爲何會加上判斷語句,是由於網站有反爬機制,經過加上判斷機制,纔可以正常的循環爬取。

3. 運行結果

3、完整代碼

# encoding: utf-8''' @software: Pycharm @file: 古詩詞.py @Version:1.0 '''"""https://www.gushiwen.cn/https://so.gushiwen.cn/shiwen/"""import requestsimport timeimport randomimport csvfrom lxml import etree
start_url = "https://so.gushiwen.cn/shiwen/"base_url = "https://so.gushiwen.cn"
headers = { "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",}
items = []

def parse_url(url): """解析url,獲得響應內容""" # time.sleep(random.random()) response = requests.get(url=url, headers=headers) return response.content.decode("utf-8")

def parse_html(html): """使用xpath解析html,返回xpath對象""" etree_obj = etree.HTML(html) return etree_obj

def get_first_type(): """獲取全部的一級類型""" first_type_list = []
html = parse_url(start_url) etree_obj = parse_html(html)
first_type_name_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/text()') first_type_url_list = etree_obj.xpath('(//a[contains(@href,"/gushi/")]|//a[contains(@href,"/wenyan/")])/@href') data_zip = zip(first_type_name_list, first_type_url_list)
for data in data_zip: first_type = {} first_type["name"] = data[0] first_type["url"] = data[1] first_type_list.append(first_type)
return first_type_list

def get_data(first_type): """查詢數據"""
#一級類型url url = base_url + first_type["url"] first_type_name = first_type["name"]
#向一級類型url發送請求獲取二級類型數據 html = parse_url(url) etree_obj = parse_html(html) div_list = etree_obj.xpath('//div[@class="typecont"]') #二級類型類型數據div for div in div_list: #二級類型名稱 second_type_name = div.xpath(".//strong/text()") if second_type_name: # 有的沒有二級類型 second_type_name = second_type_name[0] else: second_type_name = "" #二級類型下詩詞的名稱和url poetry_name_list = div.xpath(".//span/a/text()") poetry_url_list = div.xpath(".//span/a/@href") data_zip = zip(poetry_name_list,poetry_url_list) for data in data_zip: #item是一個詩詞數據 item = {} item["first_type_name"] = first_type_name item["second_type_name"] = second_type_name item["poetry_name"] = data[0] #詩詞url poetry_url = base_url+data[1] html = parse_url(poetry_url) etree_obj = parse_html(html) #詩詞做者 poetry_author = etree_obj.xpath('//p[@class="source"]')[0].xpath(".//text()") item["poetry_author"] = "".join(poetry_author).strip() #詩詞內容 poetry_content = etree_obj.xpath('//*[@id="contson45c396367f59"]/text()') item["poetry_content"] = "".join(poetry_content).strip() #詩詞譯文和註釋 if etree_obj.xpath('//div[@class="contyishang"]'):#有的沒有註釋 poetry_explain = etree_obj.xpath('//div[@class="contyishang"]')[0].xpath(".//text()") item["poetry_explain"] = "".join(poetry_explain).strip() else: item["poetry_explain"] = "" print(item) # 保存 save(item)

def save(item): """將數據保存到csv中""" with open("./古詩詞.csv", "a", encoding="utf-8") as file: writer = csv.writer(file) writer.writerow(item.values())
def start(): first_type_list = get_first_type() for first_type in first_type_list: get_data(first_type)

if __name__ == '__main__': start()

4、保存結果

此程序還有一點小問題,就是因爲網站存在有JS加密。有一部分沒法正常保存下來。不過不要緊,後期再進行改進!


正文結束!!!!



歡迎關注公衆號:Python爬蟲數據分析挖掘

記錄學習python的點點滴滴;

回覆【開源源碼】免費獲取更多開源項目源碼;

公衆號每日更新python知識和【免費】工具;

本文已同步到【開源中國】、【騰訊雲社區】、【CSDN】;

本文分享自微信公衆號 - Python爬蟲數據分析挖掘(zyzx3344)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索