摘要:項目簡介本文將介紹一個筆者自己的項目自制簡單的詩歌搜索系統。該項目使用的模塊為其中,模塊和模塊用來制作爬蟲,爬取網上的詩歌。
項目簡介
??本文將介紹一個筆者自己的項目:自制簡單的詩歌搜索系統。該系統主要的實現功能如下:指定一個關鍵詞,檢索出包含這個關鍵詞的詩歌,比如關鍵詞為“白云”,則檢索出的詩歌可以為王維的《送別》,內容為“下馬飲君酒,問君何所之?君言不得意,歸臥南山陲。但去莫復問,白云無盡時。”
??該項目使用的Python模塊為:
requests
BeautifulSoup
pymongo
tornado
其中,requests模塊和BeautifulSoup模塊用來制作爬蟲,爬取網上的詩歌。pymongo模塊用來將爬取的詩歌寫入到MongoDB數據庫。tornado模塊用于網頁端展示。
??該項目主要分以下三步實現:
收集數據:使用爬蟲,爬取網上的詩歌作為項目的數據集;
存入數據庫:將爬取到的詩歌寫入到MongoDB數據庫;
網頁展示:利用tornado框架實現詩歌搜索功能。
該項目的結構如下:
數據收集??首先,我們利用Python爬蟲來爬取詩歌,存為CSV文件poem.csv。爬取的網址為:https://www.gushiwen.org 。由于僅是展示該項目的思路,因此,只爬取了該頁面中的唐詩三百首、古詩三百、宋詞三百、宋詞精選,一共大約1100多首詩歌。
??實現該爬蟲的代碼文件為poem_scrape.py,代碼如下:
# -*- coding: utf-8 -*- import re import requests from bs4 import BeautifulSoup import pandas as pd # 爬取的詩歌網址 urls = ["https://www.gushiwen.org/gushi/tangshi.aspx", "https://www.gushiwen.org/gushi/sanbai.aspx", "https://www.gushiwen.org/gushi/songsan.aspx", "https://www.gushiwen.org/gushi/songci.aspx" ] poem_links = [] # 詩歌的網址 for url in urls: # 請求頭部 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"} req = requests.get(url, headers=headers) soup = BeautifulSoup(req.text, "lxml") content = soup.find_all("div", class_="sons")[0] links = content.find_all("a") for link in links: poem_links.append(link["href"]) # print(poem_links) # print(len(poem_links)) content_list = [] title_list = [] dynasty_list = [] poet_list = [] # 爬取詩歌頁面 def get_poem(url): #url = "https://so.gushiwen.org/shiwenv_45c396367f59.aspx" # 請求頭部 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"} req = requests.get(url, headers=headers) soup = BeautifulSoup(req.text, "lxml") # 詩歌內容 poem = soup.find("div", class_="contson").text.strip() poem = poem.replace(" ", "") poem = re.sub(re.compile(r"([sS]*?)"), "", poem) poem = re.sub(re.compile(r"([sS]*?)"), "", poem) poem = re.sub(re.compile(r"。([sS]*?)"), "", poem) poem = poem.replace("!", "!").replace("?", "?").replace(" ", "") content = poem if content: content_list.append(content) else: content_list.append("") # 詩歌朝代,詩人 dynasty_poet = soup.find("p", class_="source").text if ":" in dynasty_poet: dynasty, poet = dynasty_poet.split(":") else: dynasty, poet = "", "" dynasty_list.append(dynasty) poet_list.append(poet) # 詩歌標題 title = soup.find("h1").text if title: title_list.append(title) else: title_list.append("") # 爬取詩歌 for url in poem_links: get_poem(url) # 寫入至csv文件 df = pd.DataFrame({"title": title_list, "dynasty": dynasty_list, "poet": poet_list, "content": content_list }) print(df.head()) df.to_csv("./poem.csv", index=False)
儲存的poem.csv的前幾行如下:
數據庫??數據收集完畢后,我們需要將這些數據出訪到數據庫中,便于后續的調用,在這里選擇MongoDB。利用文件write2mongodb.py文件可以將剛才爬取到的詩歌存放至MongoDB數據庫中,完整的代碼如下:
import pandas as pd from pymongo import MongoClient # 連接MongoDB conn = MongoClient("mongodb://localhost:27017/") db = conn["test"] # 插入詩歌 df = pd.read_csv("poem.csv") columns = ["title", "dynasty", "poet", "content"] for i in range(df.shape[0]): print(i) row = df.iloc[i, :] db.poem.insert(dict(zip(columns, row[columns])))
??不到一分鐘,我們可以看到MongoDB中的內容如下:
前端展示??準備好數據集后,我們需要可視化地展示詩歌檢索功能,我們選擇tornado這個框架來實現。詩歌檢索功能為:指定一個關鍵詞,檢索出包含這個關鍵詞的詩歌。關鍵詞由用戶輸入,提交HTTP請求,在后臺實現詩歌檢索功能,然后在前端頁面展示出來。
??實現的server.py的代碼如下:
# -*- coding: utf-8 -*- import random import os.path import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import define, options from pymongo import MongoClient # 連接MongoDB conn = MongoClient("mongodb://localhost:27017/") coll = conn["test"].poem #定義端口為8000 define("port", default=8000, help="run on the given port", type=int) # GET請求 class QueryHandler(tornado.web.RequestHandler): # get函數 def get(self): self.render("query.html") # POST請求 # POST請求參數:query_string class ResultHandler(tornado.web.RequestHandler): # post函數 def post(self): query = self.get_argument("query_string") res = list(coll.find({"content": {"$regex": query}})) if len(res) > 0: result = random.sample(res, 1)[0] del result["_id"] title = result["title"] dynasty = result["dynasty"] poet = result["poet"] content = result["content"] else: title = "" dynasty = "" poet = "" content = "" self.render("result.html", query=query, title=title, dynasty=dynasty, poet=poet, content=content) # 主函數 def main(): tornado.options.parse_command_line() # 定義app app = tornado.web.Application( handlers=[(r"/query", QueryHandler), (r"/result", ResultHandler)], #網頁路徑控制 template_path=os.path.join(os.path.dirname(__file__), "templates") # 模板路徑 ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start() main()
其中,query路徑對應的網頁query.html的代碼如下:
Poem Query 請輸入查詢
result路徑對應的網頁result.html如下:
使用示例Result 查詢詞:{{query}}
標題:{{title}}
朝代:{{dynasty}}
詩人:{{poet}}
內容:{{content}}
??運行server.py, 在瀏覽器中輸入網址:http://localhost:8000/query ,界面如下:
在其中輸入搜索關鍵詞,比如“白云”,則會顯示一條隨機的結果,如下:
點擊“查詢詞高亮”,則查詢詞部分會高亮顯示。
總結??本項目僅為展示詩歌檢索的一種實現思路,仍有許多功能還待完善,后續將進一步補充實現。本項目的github地址為:https://github.com/percent4/P... 。
注意:本人現已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關注哦~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43163.html
摘要:的官方網址為,其使用手冊網址為本次分享將實現的功能為利用爬取某個搜索詞語暫僅限英文的百度百科的介紹部分,具體的功能介紹可以參考博客爬蟲自制簡單的搜索引擎。 ??Jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數據。Jsoup的官方網址為: https:...
摘要:優雅的使用框架,爬取唐詩別苑網的詩人詩歌數據同時在幾種動態加載技術中對比作選擇雖然差不多兩年沒有維護,但其本身是一個優秀的爬蟲框架的實現,源碼中有很多值得參考的地方,特別是對爬蟲多線程的控制。 優雅的使用WebMagic框架,爬取唐詩別苑網的詩人詩歌數據 同時在幾種動態加載技術(HtmlUnit、PhantomJS、Selenium、JavaScriptEngine)中對比作選擇 We...
摘要:經過筆者這幾天的辛勤勞作其實就是苦逼地碼代碼,一個新的網站已經上線啦該網站是用工具寫的,主要實現的功能如下根據歌曲名稱和音樂平臺搜索歌曲,并實現歌曲的在線播放歌曲的下載功能網頁統計量功能開發歷史介紹。 ??經過筆者這幾天的辛勤勞作(其實就是苦逼地碼代碼),一個新的網站已經上線啦!該網站是用Spring Boot工具寫的,主要實現的功能如下: 根據歌曲名稱和音樂平臺搜索歌曲,并實現歌曲...
摘要:環境操作系統版本代碼實現我們要實現用來發微信,發送的內容是每天最新的天氣信息。接下來就是登錄微信定時發送消息了。 showImg(https://segmentfault.com/img/remote/1460000018634433); 0 引言 前段時間找到了一個免費的天氣預報API,費了好段時間把這個API解析并組裝成自己想用的格式了,就想著如何實現每天發送天氣信息給自己。最近無...
閱讀 2929·2021-10-14 09:43
閱讀 2867·2021-10-14 09:42
閱讀 4639·2021-09-22 15:56
閱讀 2355·2019-08-30 10:49
閱讀 1587·2019-08-26 13:34
閱讀 2370·2019-08-26 10:35
閱讀 590·2019-08-23 17:57
閱讀 2023·2019-08-23 17:15