孫俊 李秋月 趙晨悅




摘 ?要:文章以Python語言為基礎編寫了一個爬蟲程序,用于獲取網絡上關于圖書的信息,經過數據清洗和篩選后存入到數據庫中實現數據的長久保存。在經過廣泛查閱相關主題著作、論文、使用手冊等資料后,在借鑒前人的研究成果的基礎上,參考了圖書評價人員給出的圖書得分,嘗試去除網絡水軍對圖書得分的影響,最后通過給定的新的圖書分值計算公式,重新計算圖書得分,并以新的分數推薦給用戶。
關鍵詞:Python;圖書;推薦;查詢
中圖分類號:TP311 ? ? ? 文獻標識碼:A文章編號:2096-4706(2022)05-0030-04
Collection and Display Research of Book Information Based on Python
SUN Jun1, LI Qiuyue1, ZHAO Chenyue2
(1.Zhengzhou Technical College, Zhengzhou ?450121, China; 2.Zhengzhou Information Engineering Vocational College, Zhengzhou ?450121, China)
Abstract: This paper writes a crawler program based on the Python language to obtain information about books on the Internet. After data cleaning and filtering, it is stored in the database to achieve long-term data storage. After extensive review of relevant subject works, papers, user manuals and other materials, on the basis of using for reference from previous research results, and referring to the book scores given by book reviewers, it tries to remove the influence of the Internet army on the book scores. Finally, through the given new book score calculation formula, the book score is recalculated, and the new score is recommended to the user.
Keywords: Python; book; recommendation; query
0 ?引 ?言
在移動互聯網快速發展的今天,各種各樣的圖書以及圖書評論和圖書排名的網站層出不窮。面對如此浩瀚的信息,人們在選擇圖書的時候總會感到茫然和困惑,不知應該聽從哪一家的圖書排行信息。而且在互聯網上在圖書數據肯圖書評論數據存在大量灌水現象,讓人難以分辨。除此之外,各種閱讀門戶網站主要推薦的是網絡小說,但是對經典著作等排序甚少,而且雜亂無章,可信度低[1]。本項目通過爬蟲程序在互聯網搜集圖書信息,然后使用新的計算方法計算圖書分值。憑借新在圖書分值能夠為用戶推薦圖書。圖書評分經過重新計算,減少了網絡水軍對圖書分值的影響,增加了圖書分值的合理性。
1 ?開發平臺與開發工具
本項目使用了目前流行的網絡爬蟲語言Python。該語言具有高性能,語言簡潔方便,較為實用的特點。Python語言因其自身簡單和豐富資源庫的特性,在網絡爬蟲和數據分析方面有著巨大的優勢[2,3]。本項目使用的開發環境是Python2.7版本。開發工具是PyCharm。在數據庫方面使用的是MySQL5.7版本。
1.1 ?Python
Python是一個自由軟件,語言簡潔清晰。其語言特點是語言縮進強制使用空白符。因為Python是一個開源軟件,所以它有豐富的第三方庫,使得Python使用更加方便高效[4]。Python語言豐富的第三方庫中就包括為了解決網絡爬蟲問題而設計的庫,語言結構精簡,因此在網絡爬蟲方面Python語言有著其他語言所沒有的優勢[5]。
1.2 ?MySQL
MySQL是一種小型的數據庫,體積很小,運行的速度較快,使用的成本比較低,使用方便簡潔,個人使用便捷,所以被大量用戶用于個人使用[6]。
2 ?系統功能及市場需求分析
在目前的互聯網上有大量的圖書評論和圖書排行榜。但是,這些圖書很多都是網絡小說,只在網絡上流行,沒有出版實體書,僅僅依靠在網絡上獲取關注[7]。網民們更加喜歡這種簡單直白的文字小說,所以在一些圖書類網站為了迎合網民口味,更多的關注網絡小說,而對于傳統的出版圖書卻有很少的關注。以至于只有豆瓣這一家是較為可靠并且大型的圖書評論和圖書排行網站[8]。但是,隨著豆瓣圖書排行越來越受到關注度,所以引來了眾多水軍參與圖書評價,導致豆瓣的圖書評分系統存在一定的不合理性[8]。而且豆瓣的圖書相關功能里面并沒有圖書推薦功能。只是在每年年末提供當年的新書推薦[9]。本項目彌補這一項的不足,因此依靠豆瓣圖書數據重新給圖書進行評分,并按用戶喜歡的圖書類型為用戶提供高分書籍。這也彌補了圖書市場推薦功能的不足。并且圖書推薦和分值計算采用了已有的和豆瓣圖書數據,有一定的數據合理性基礎。
2.1 ?系統功能需求
功能上要滿足以下兩點:(1)用戶通過輸入關鍵詞,系統能夠為用戶推薦相關的書籍信息。(2)用戶可以直接搜索某本書的基本信息。
2.2 ?系統性能需求
在數據收集在過程中,使用Python語言制作的爬蟲爬取約為四萬條數據,因此需要采用多線程的方式加快爬蟲進度。但是這樣會給服務器帶來巨大的壓力。如果因為給服務器帶來巨大壓力,導致爬蟲程序被禁止提供服務,則爬取完全失敗。所以在爬蟲運行的過程中要限制爬取速度。按照網站的要求,遵守網站的規則,不獲取網站禁止獲取的內容,尤其是在爬取豆瓣網圖書信息的時候,由于豆瓣限制訪問速度為150次每小時,所以爬取豆瓣圖書數據非常緩慢。
綜上所述,豆瓣網的爬蟲采用單線程的方式進行爬取,避免被豆瓣網禁止訪問;而當當網的爬蟲可以使用多線程爬取,用于節約時間。
3 ?項目完整流程
首先是爬蟲文件,用于收集當當網小說部分的圖書信息。獲取的信息包括圖書的全球唯一編號、國際標準書號(International Standard Book Number, ISBN)、圖書的名稱、圖書的作者、圖書價格、圖書所在的當當網頁面地址。然后依據圖書ISBN信息,通過豆瓣API接口訪問豆瓣數據庫,獲取圖書信息。然后把圖書信息進行解析,得到具體數據。接著把數據保存到數據庫中,做數據分析。最后制作用戶接口,與用戶進行信息交互。
4 ?項目文件及功能實現
本小節主要介紹本項目的文件以及文件作用和文件中的一些重要代碼。
4.1 ?GetDangdangbookWriteToMySQL.py
文件作用:從當當網上獲取圖書信息并保存到數據庫中。以下為獲取頁面中二級頁面URL鏈接的函數代碼。
def get_two_level_url(soup,url_list):
# 獲取網頁信息
# 解析網頁信息
# 得到主要內容
4.2 ?GetDangdangXiaoshuoWriteToFile.py
文件作用:獲取當當網上小說部分的圖書URL(Uniform / Universal Resource Locator,統一資源定位符)信息并保存到文件中。以下為獲取頁面中所需要的信息的函數代碼,把獲取的信息保存到字典格式的數據中。
def get_book_info(soup,dict,isbn_list):
# 依據給定的ISBN號獲取當當網上圖書頁面的圖書信息
4.3 ?GetTagsAndValue.py
文件作用:獲取圖書標簽并按照標簽出現的次數排序。以下代碼為遍歷每個列表中的數據,然后按照出現次數排序。
for i in results:
# 清理獲取到的圖書信息
# 將圖書信息保存到數據庫中
4.4 ?GetUrlWriteToDoubanbookinfolMySQL.py
文件作用:從數據庫中讀取圖書ISBN信息,并通過豆瓣API(Application Programming Interface,應用程序編程接口)獲取豆瓣網上圖書的信息。
4.5 ?start.py
與用戶進行交互的接口程序。
4.6 ?NewValue.Py
文件作用:計算圖書的綜合得分。以下代碼為計算圖書綜合評分的代碼。
for i in results:
# 獲取數據庫每本圖書的信息
# 計算圖書新的得分
# 將新的得分信息保存到數據庫中
4.7 ?getTagValue.py
文件作用:用于計算圖書標簽的得分。
5 ?網頁數據處理技術
獲取的網頁有兩種格式:Html和Json。
Html格式是互聯網最為常用的一種網頁格式。該格式網頁可以通過BeautifulSoup庫進行直接的解析,獲取網頁內的標簽元素和信息,然后對信息進行收集和處理。這里主要用于當當網上圖書信息收集。主要步驟為:(1)通過ruquest庫中的函數獲取給定的URL的網頁信息。(2)使用Beautifulsoup庫中的函數解析獲取的網頁信息。(3)獲取到的圖書信息以字典格式存儲,然后保存到bookspider數據庫中的dangdangbookinfo表中。
Json格式的數據需要用到Python的第三方Json庫對該格式信息進行解析。主要用在通過豆瓣網API獲取圖書信息。主要步驟為:(1)讀取數據庫庫中的ISBN信息并以列表形式存儲。(2)把讀取到的ISBN和豆瓣API接口連接起來組成字符串,然后依據該URL通過request庫中的函數后去該URL指定的網頁信息。(3)通過json庫中的函數解析獲取的頁面信息,然后以字典的格式存儲數據。(4)把圖書信息存儲到bookspider數據庫中的doubanbookinfo表中。
6 ?數據清洗和處理以及數據庫存儲
在獲取的當當網圖書信息時,有的圖書信息錯誤或者信息不完善。所以要對不完善的信息進行補全,錯誤在信息進行修正。有的圖書信息內容錯誤或者格式不正確,需要刪除此圖書的信息。有的圖書信息和其他書籍信息相互顛倒,需要刪除。在經過對數據的清洗后,本項目以全球唯一圖書編號ISBN作為主鍵,把圖書數據存儲到本地的MySQL數據庫中。
在獲取當當網關于圖書的信息之后,項目系統根據豆瓣網提供的API,按照ISBN號碼獲取豆瓣網上該圖書的信息。在獲取圖書信息時可能會出現的錯誤包括ISBN重復、沒有該ISBN號碼的圖書信息肯存儲到數據庫錯誤。
7 ?數據分析及分數重計算
在獲取數據并存儲到數據庫中之后需要對數據進行清洗,之后進行數據分析,計算綜合得分。之所以對豆瓣圖書進行重新評分,具體原因有:(1)豆瓣評分來源于用戶的自主評分,用戶在評分時沒有考慮到該圖書的易讀性,由于人的主觀因素這是不可避免的。(2)豆瓣部分圖書評分有水軍參與,刻意降低了該圖書的評分。
綜合得分是在原有的豆瓣評分的基礎上添加了評價人數得分和標簽得分。這樣就增加圖書易讀性得分,使得圖書評分考慮到了讓用戶能夠讀懂該圖書。
計算綜合得分的公式為:
a×5+ln(b)×2.5+c×2.5(1)
式(1)中,a為該書豆瓣得分,b為該書評價人數,c為該書標簽綜合得分。
c的計算公式為:
(2)
式(2)中,d為該圖書所有標簽中某一標簽個數,e為另一標簽個數,f為另一標簽個數,n為總標簽數。即求出每個標簽出現次數的自然對數字,然后把每個值相加求和再除以總標簽數。
8 ?程序設計與編碼實現
8.1 ?當當網爬蟲程序
當當網的圖書主頁使用的是html格式的網頁文件。本項目程序使用Python中的requests庫來獲取頁面源代碼。使用BeautifulSoup庫解析網頁格式,然后獲取主要信息。該過程首先是獲取當當網上小說分類下的所有網頁。在這一級頁面下獲取每個圖書的URL鏈接,然后進入下一頁獲取圖書詳情頁的鏈接,最后獲取所有圖書詳情頁URL鏈接,并保存到鏈表中。循環遍歷這個鏈表,依次訪問這些圖書詳情頁的網址連接,通過程序獲取在當當網上的圖書信息。獲取的圖書信息包括:圖書國際標準編號ISBN、書名、作者、出版社、價格和當當網上該圖書在URL。最后把數據存儲為字典類型的數據,統一保存到bookspider數據庫下的dangdangbookinfo表中。
8.2 ?豆瓣網爬蟲程序
豆瓣網為用戶提供了API接口,所以可以使用API便捷的爬取豆瓣網對應的圖書信息。但是,API限制了用戶訪問服務器的速度,需要申請API接口的key用于解鎖用戶身份。但是豆瓣在早些年的時候由于內部原因取消了訪問申請,所以現在只能以游客的身份進行爬取。沒有注冊的用戶訪問速度受到限制,只能以每小時150次訪問的速度進行訪問。
按照豆瓣網信息服務提供頁提供的API說明,豆瓣網所提供的數據是json格式。因此需要對獲取的數據進行解析,解析完的數據保存在一個字典類型在變量中,最后批量保存到自定義的bookspider數據庫的doubanbookinfo表中。其保存的圖書信息有:圖書國際統一編號ISBN、書名、作者、作者簡介、標簽、評價人數、評分、豆瓣ID、包裝、頁數、出版社、原標題、豆瓣鏈接、圖片和評論。
8.3 ?分數計算
標簽分數計算。標簽計算分數主要是考慮到該圖書的易讀性。如果該圖書的標簽在其他圖書中出現,而且出現次數很多,則說明該圖書較為通俗,能讓大部分讀者接受,具有較高的易讀性。標簽出現次數的價值增長隨著出現次數的增多而逐漸變慢,所以采用對數建模比較合適。求出每個標簽價值的總和后再求平均數,可使數據范圍在給定的范圍之間。
綜合得分計算。綜合得分計算主要有三部分組成。豆瓣得分反應大家對該圖書的主觀評價得分,評價人數和標簽得分反應該圖書的易讀性得分。綜合起來,給予豆瓣評5.0的權值,給予評價人數得分和標簽得分各2.5的權值,使得最后的最高綜合得分約為100分。該權值的分配是考慮到該圖書本身的價值和該圖書易讀性的價值。在為用戶推薦相關圖書時能夠更加準確滿足用戶需求。
8.4 ?用戶交互界面
本項目采用了一個Python自帶的簡單地與用戶交互的界面。用戶可以在這個界面里查找圖書相關信息和獲取推薦的圖書信息。該界面采用Python consoleline,通過用戶輸入信息與用戶進行交互。擁有交互界面的主要原因是,通過用戶輸入的信息去搜索含有該標簽的書籍,然后按照綜合評分排序為用戶推薦書籍。
圖1為程序運行時進行搜索的實例,通過搜索“三體”一詞獲取圖書信息中ISBN,或書名,或作者名中包含“三體”一詞的圖書信息,然后再界面中顯示出搜索到的圖書信息,包括ISBN、書名,作者名,評分人數,豆瓣評分和豆瓣網鏈接。用戶可以通過豆瓣網鏈接直接查看豆瓣網上該圖書的詳細信息。
圖1 ?圖書搜索運行截圖
圖2為系統運行時進行圖書推薦的實例,通過“小說”一詞獲取圖書信息標簽中包含“小說”一詞的圖書信息,然后再按照圖書的綜合評分由高到低排列,在界面中顯示出推薦的前十名圖書的圖書信息。顯示的圖書信息包括圖書ISBN號碼、圖書名稱、作者名稱、評分人數、豆瓣評分和豆瓣網鏈接。
圖2 ?圖書推薦運行截圖
9 ?數據存儲
數據存儲在MySQL數據庫中。使用該數據庫主要是因為使用方便,操作簡單,容易用戶使用。本系統創建的數據庫名稱為bookspider。主機名或IP地址為localhost,端口號為3306,用戶名為root,密碼為root。其中共有三個數據表,分別是dangdnagbookinfo,doubanbookinfo和tagvalue,在此只列舉前兩個數據表。
9.1 ?dangdangbookinfo表
該表保存了從當當網上爬取的圖書信息,其中ISBN作為全球圖書唯一編號可以作為主鍵。表1列出了該數據表中的字段名,相應的字段描述,字段類型,是夠為主鍵以及是否允許為空。
9.2 ?doubanbookinfo表
該表保存了豆瓣網爬取的圖書信息,其中ISBN作為全球圖書唯一編號可以作為主鍵。表2列出了該數據表中的字段名,相應的字段描述,字段類型,是夠為主鍵以及是否允許為空。
10 ?結 ?論
本項目是主要功能是圖書推薦和圖書查找。圖書推薦的依據是豆瓣網上的圖書信息。通過對豆瓣數據庫的爬取,獲取圖書信息,之后對數據進行清洗和處理。本項目實現了為用戶推薦圖書功能,這是豆瓣沒有提供的,也是其他大型圖書網站所沒有的。在為用戶推薦圖書時,采用了一種新的圖書評分計算方法,其中參考了豆瓣評分和評價人數,之后計算出綜合評分。相比較于豆瓣的評分更加合理。本項目通過豆瓣數據進行重新處理和優化,使數據更加準確,能為用戶提供更加可靠的圖書推薦。
參考文獻:
[1] 李琳.基于Python的網絡爬蟲系統的設計與實現 [J].信息通信,2017(9):26-27.
[2] 楊國軍.基于Python的數據爬蟲的設計與實現 [J].數字技術與應用,2020,38(10):153-154+158.
[3] DONEY A B.像計算機科學家一樣思考Python [M].趙普明,譯,北京:人民郵電出版社,2016.
[4] LAWSON.用Python寫網絡爬蟲 [M].李斌,譯,北京:人民郵電出版社,2016.
[5] NELLI F.Python數據分析實戰 [M].杜春曉,譯,北京:人民郵電出版社,2016.
[6] 劉增杰.MySQL 5.7從入門到精通(視頻教學版) [M].北京:清華大學出版社,2016.
[7] 王文民.中國圖書市場分析 [D].成都:西南交通大學,2007.
[8] 劉高軍,印佳明.基于圖書特征及詞典的豆瓣圖書垃圾評論識別 [J].計算機技術與發展,2019,29(11):107-112.
[9] 丁媛媛.淺析豆瓣圖書“一星運動” [J].新聞研究導刊,2020,11(9):71-72.
作者簡介:孫俊(1994.12—),男,漢族,河南鄭州人,助教,碩士,研究方向:人工智能、自然語言處理;李秋月(1992.01—),女,漢族,河南周口人,助教,碩士,研究方向:網絡信息安全、物聯網技術、人工智能應用;趙晨悅(1994.06—),男,漢族,河南鄭州人,助教,學士,研究方向:應用程序開發、計算機網絡。