基于python的網(wǎng)絡(luò)爬蟲設(shè)計_第1頁
基于python的網(wǎng)絡(luò)爬蟲設(shè)計_第2頁
基于python的網(wǎng)絡(luò)爬蟲設(shè)計_第3頁
基于python的網(wǎng)絡(luò)爬蟲設(shè)計_第4頁
基于python的網(wǎng)絡(luò)爬蟲設(shè)計_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

摘要嗶哩嗶哩視頻彈幕網(wǎng),從一開始的無名小站發(fā)展到現(xiàn)在月活躍用戶超一億的巨大規(guī)模,不僅引起了行業(yè)浪潮,也吸引越來越多人選擇成為UP主(Uploader)即視頻上傳者。Bilibili網(wǎng)為UP主提供了平臺和各種功能支持,但還是無法面面俱到。本軟件設(shè)計旨在提供便捷的剛需功能,為新興UP主提供功能支持。本畢業(yè)設(shè)計采用標(biāo)準(zhǔn)的軟件開發(fā)流程,包含了需求分析、整體設(shè)計、模塊實現(xiàn)、編碼、測試、打包軟件等等步驟。該軟件算法和輪廓基于python設(shè)計,調(diào)用了包含requests、random、pickle等等成熟的集成庫環(huán)境。軟件主要針對用戶需求頗多的兩個主要分支:評論和抽獎進行設(shè)計實現(xiàn)。評論區(qū)功能包括爬取完整的表單數(shù)據(jù),解決復(fù)數(shù)層評論的獲取和存儲,實現(xiàn)快速瀏覽、存儲和多種查找功能;抽獎區(qū)功能包括實現(xiàn)爬取多種抽獎材料,根據(jù)需求分析樣本并最終使用隨機算法進行隨機數(shù)獲取,實現(xiàn)抽獎功能。關(guān)鍵詞:爬蟲bilibili用戶python

AbstractBilibilihasstartedasanunfamousacgwebatthebeginningandnowhaveahugescaleofover100millionactiveuserseachmouth,whichiscausingawaveandattractedmoreandmorepeopletochoosetobecomeaUPloader.BilibiliprovidesUploaderssportandvariousfunctionsfortheusers,butitstillcannotcovereverything.Thissoftwareisdesignedtoprovideconvenientandneededfunctionstousers.Thisgraduationdesignusesastandardsoftwaredevelopmentprocess,includingrequirementsanalysis,overalldesign,moduleimplementation,coding,testing,packagingandothersteps.Thesoftwarealgorithmandoutlinearedesignedbasedonpython,andcallthematureintegratedlibraryenvironmentincludingrequests,random,pickleandsoon.Thesoftwareismainlydesignedandimplementedtoslovetwomainfunctionswithmanyuserneeds:reviewsandlotteries. Thereviewfunctionincudingcrawlingcompleteformdatas,solvingtheacquisitionandstorageofmultiplelayersofreviews,realizingquickbrowsing,storageandmultiplesearchfunctionsandsoon.Thelotteryfunctioncontainscrawlingmultipledatastoanalysisandfinallyfinishtherandomchoise.Keywords:WebCrawlerBilibiliUserPython 目錄1緒論 緒論項目背景與意義近年來隨著網(wǎng)絡(luò)的飛速發(fā)展和建設(shè),人們獲取信息的途徑也從主流的報紙電視,過渡到手機電腦等網(wǎng)絡(luò)平臺。各類別的文化借此逐漸滲透到人們周圍的生活中。作為國內(nèi)起步最早的一批二次元視頻網(wǎng)站之一,嗶哩嗶哩以其獨有的彈幕文化逐步發(fā)展成現(xiàn)在國內(nèi)流量第一的視頻彈幕網(wǎng)站。嗶哩嗶哩視頻內(nèi)容的高跨度、高質(zhì)量、高時效力也為其吸引了巨大的現(xiàn)有用戶和潛在用戶,2019年5月起月活躍用戶數(shù)突破1億,并且還在呈現(xiàn)增長趨勢。作為一個互聯(lián)網(wǎng)公司,嗶哩嗶哩是成功的。但其擁有的龐大用戶數(shù)量,注定決定了嗶哩嗶哩無法做到面面俱到,滿足所有用戶的需求。嗶哩嗶哩主要的運作方式為網(wǎng)頁,依賴數(shù)據(jù)的建設(shè)和支持為用戶提供了很棒的功能。本課題的主要目的是設(shè)計面向用戶的網(wǎng)絡(luò)爬蟲程序,提供用戶一些官方并未提供的功能,比如類別抽獎和數(shù)據(jù)獲取。1.2國內(nèi)外研究情況近年來,國內(nèi)外程序研究人員提出了許多種類的網(wǎng)絡(luò)爬蟲結(jié)構(gòu)與算法,亦應(yīng)用在不同的行業(yè)與領(lǐng)域,大大提高信息利用率和工作效率。許多大型軟件公司也積極地根據(jù)自身行業(yè)特點與需求,開發(fā)出許多類別的網(wǎng)絡(luò)爬蟲系統(tǒng),比如google,微軟的bingbot和yahoo的slirp等等。本課題研究的方向是提供特定網(wǎng)站嗶哩嗶哩的額外功能實現(xiàn),在經(jīng)過網(wǎng)絡(luò)查詢后發(fā)現(xiàn),國內(nèi)目前并未有人系統(tǒng)地開發(fā)過相應(yīng)軟件,可以說是較為新穎的研究課題。并且考慮到嗶哩嗶哩用戶基數(shù)大,前景可期,用戶需求只會越來越多,本課題的研究實現(xiàn)也具有了現(xiàn)實意義。具備研究價值。在實現(xiàn)預(yù)期目標(biāo)的同時,將一同研究作為功能性的爬蟲程序,在面對復(fù)雜、多樣性的環(huán)境下可能出現(xiàn)的問題,合理借鑒前人研究經(jīng)驗,解決和優(yōu)化。1.3文獻綜述對于網(wǎng)絡(luò)爬蟲的研究從上世紀(jì)九十年代就已經(jīng)開始,目前爬蟲技術(shù)已經(jīng)趨見成熟,功能描述向高概括性高度模塊化靠攏。網(wǎng)絡(luò)爬蟲是搜索引擎的重要組成部分。網(wǎng)絡(luò)上比較著名的開源爬蟲有Nutch,Larbin,Heritrix等等。網(wǎng)絡(luò)爬蟲最重要的是網(wǎng)頁搜索策略(廣度優(yōu)先和最佳度優(yōu)先)和網(wǎng)頁分析策略(基于網(wǎng)絡(luò)拓?fù)涞姆治鏊惴ê突诰W(wǎng)頁內(nèi)容的網(wǎng)頁分析算法)。國內(nèi)外流行的爬蟲技術(shù)相當(dāng)多,各個編程語言都有涉及?;赑ython、C++、C、java等等。就原理而言,爬蟲組件都是差不多的。而無頭瀏覽器是最能夠說明爬蟲特性的部分,無需提供多余的身份信息即可向服務(wù)器請求數(shù)據(jù),以適用于自動化測試等領(lǐng)域。此外主流的瀏覽器如Chrome、Firefox、Safari等都提供了相應(yīng)的抓取支持,selenium作為一個集成工具,包含了上述的所有組件,以WebDriver的形式,直接在瀏覽器進行測試,適配各種爬蟲組件,方便使用者進行操作。PAGE2網(wǎng)絡(luò)爬蟲介紹2.1網(wǎng)絡(luò)爬蟲原理網(wǎng)絡(luò)爬蟲行為上就是模擬真人進行流程操作,獲取網(wǎng)頁返回的數(shù)據(jù)進行儲存分析,等同于瀏覽器對網(wǎng)頁的訪問。因這種技術(shù)實現(xiàn)很像蜘蛛在蛛網(wǎng)上的往返爬行,也被生動地取名為爬蟲。其實質(zhì)就是一個請求網(wǎng)站并儲存數(shù)據(jù)的自動化程序。2.2網(wǎng)絡(luò)爬蟲框架下圖為一個通用的網(wǎng)絡(luò)爬蟲框架。通過調(diào)用URL在隊列中進行管理,實現(xiàn)數(shù)據(jù)獲取和保存。已下載網(wǎng)頁庫已下載網(wǎng)頁庫種子URL待抓取URL已抓取URL讀取解析下載放進隊列圖2.1網(wǎng)絡(luò)爬蟲框架圖2.3網(wǎng)絡(luò)爬蟲工作流程2.3.1向服務(wù)器發(fā)起請求爬蟲程序通過request向目標(biāo)網(wǎng)站的服務(wù)器發(fā)起請求,服務(wù)器會根據(jù)request內(nèi)包含的請求作出處理,返回瀏覽器結(jié)果,這個過程即為response。而Request包含:1、請求方式常用的有GET和POST兩種請求類型,另外還有HEAD、PUT、OPTIONS等。2、請求URLURL即(UniformResourceLocator)統(tǒng)一資源定位符,網(wǎng)頁、歌曲、視頻、圖片都可以用一個唯一URL確定定位。3、請求頭發(fā)送請求時可選的頭部信息,取決于網(wǎng)頁的請求要求,常見有Cookies、Host等。4、請求體發(fā)送請求時可選的額外數(shù)據(jù),比如提交的表單、文本數(shù)據(jù)。2.3.2獲取響應(yīng)內(nèi)容服務(wù)器返回的response包含:1、響應(yīng)狀態(tài)即狀態(tài)碼,比如200為處理成功,404為未找到請求頁面。2、響應(yīng)頭包含返回的內(nèi)容格式、長度、類型等自然信息,以及服務(wù)器信息等。3、響應(yīng)體即請求的資源內(nèi)容,爬蟲獲取最主要的部分。2.3.3解析內(nèi)容根據(jù)獲取的數(shù)據(jù)類型,比如HTML文檔,JSON格式文本,圖片,歌曲視頻等等,作出相應(yīng)處理。處理方式有直接處理,正則表達式,json解析,beautifulsoUP等等。2.3.4儲存分析以不同的格式:文本、json、jpg、mp3等等儲存數(shù)據(jù),作進一步處理分析。廣東東軟學(xué)院本科畢業(yè)設(shè)計(論文)3軟件整體設(shè)計3.1程序需求分析嗶哩嗶哩網(wǎng)站作為新類別媒體平臺的代表,在近幾年以其內(nèi)容的高跨度、高質(zhì)量、高影響力吸引了巨大的現(xiàn)有用戶和潛在用戶,2019年5月起月活躍用戶數(shù)突破1億,并且還在呈現(xiàn)增長趨勢。UP主,一個嗶哩嗶哩網(wǎng)站視頻創(chuàng)作者的別稱,為嗶哩嗶哩海量視頻的產(chǎn)出增添了濃墨重彩的一筆。從起初的小受眾網(wǎng)站一步步走向了多元化的媒體平臺,這也吸引了越來越多的人成為UP主,加入到創(chuàng)作的浪潮中。本軟件面向的對象,就是數(shù)量眾多的中小規(guī)模的新UP主。許多UP主在不斷產(chǎn)出高質(zhì)量視頻后,也未必能成為粉絲過萬、十萬、百萬的大UP主。拋去主觀因素,通過網(wǎng)上調(diào)查等方式,我總結(jié)出了他們需要的一些非官方提供功能。一個全面的視頻信息匯總功能,讓用戶看到全部視頻的具體數(shù)據(jù)。一個高效的評論瀏覽功能,可以使他們了解觀眾的想法和建議,為新的內(nèi)容創(chuàng)作蓄力。一個多樣化的評論查找功能,有時需要找到特定信息,比如歌名,網(wǎng)站等等,或者查看長度較長的評論,查找功能就能很好地解決問題。這個功能也不局限于UP主,是所有用戶都能使用的功能。一個完善的抽獎功能。嗶哩嗶哩為UP主提供了許多方便的功能,抽獎就是其中之一。但為了防止濫用引發(fā)的一系列問題,該功能只提供給粉絲過萬或者有一定優(yōu)質(zhì)動態(tài)、投稿積累的UP主,新人UP主要想在前期積累人氣,抽獎功能是必不可少的。一個粉絲流動監(jiān)視功能。新人UP主最關(guān)注的應(yīng)該就是粉絲增長趨勢了。這個功能無疑十分便捷,可以讓他們看到一步步的積累。3.2系統(tǒng)框架構(gòu)造有了需求后,就可以著手設(shè)計軟件,即面向?qū)ο缶幊?。先根?jù)用戶需求,總結(jié)出需求框架,方便后續(xù)工作流程。下圖為具體框架:圖3.1需求總結(jié)圖由需求可對程序進行初步構(gòu)造,設(shè)計成由一個初始界面框內(nèi)嵌一個多層循環(huán)且可隨時打破的菜單函數(shù)構(gòu)成的程序。設(shè)計目的是高效輸出,簡便操作,讓任何人都可以輕易上手。大致邏輯確定后,開始設(shè)計系統(tǒng)主邏輯。下圖為構(gòu)造完畢的主體與子功能循環(huán)圖:圖3.2主體與子功能循環(huán)圖如圖示,即菜單程序里的功能模塊在循環(huán)條件成立時不斷循環(huán),功能模塊也隨需求進入循環(huán)或者打破,并在用戶給出打破條件后返回主體,參與主程序循環(huán)。接下來開始設(shè)計主菜單的邏輯流程。如下圖:初始界面初始界面開始選擇執(zhí)行輸出結(jié)果菜單返回功能列表退出程序是否是否圖3.3主菜單的邏輯流程圖 圖示闡述了系統(tǒng)的實現(xiàn)方法,即用戶啟動程序,選擇進入主菜單,依實際需求選擇相應(yīng)功能,執(zhí)行完畢后,可選擇繼續(xù)操作或者返回主界面,亦或是退出程序。到這里,系統(tǒng)實現(xiàn)的大致方向已經(jīng)確定,下面開始設(shè)計各部分功能的邏輯流程。下圖為繪制好的番號互轉(zhuǎn)和評論功能實現(xiàn)邏輯:aab互轉(zhuǎn)a2b獲取b2a返回菜單退出查看評論用戶+評論評論輸入bv查看轉(zhuǎn)換結(jié)果是是是否否否圖3.4番號互轉(zhuǎn)和評論功能實現(xiàn)邏輯圖如圖中描繪,獲取評論的操作邏輯為輸入bv號,程序爬取后輸出給用戶查看,可繼續(xù)循環(huán)查詢功能或者返回主界面。而左半部分的av號與bv號互相轉(zhuǎn)換流程,在后續(xù)軟件實現(xiàn)會作進一步的補充說明。其邏輯和前部分類似,通過獲取用戶輸入的視頻編號(av/bv號)進行轉(zhuǎn)換,輸出結(jié)果。 下圖為評論查找的邏輯設(shè)計:評論查找評論查找關(guān)鍵詞查找去重查找長評查找輸入關(guān)鍵詞結(jié)果查詢返回菜單V碼獲取查詢結(jié)果否否是是圖3.5評論查找的邏輯設(shè)計圖 如圖中的設(shè)計,在獲取視頻標(biāo)識符后,對用戶的要求分別實現(xiàn),比如查詢功能接收關(guān)鍵詞字符,在比對庫后輸出結(jié)果,無論成功與否都可以重復(fù)操作或者跳出循環(huán)返回菜單。下圖為抽獎功能和粉絲流動功能的邏輯實現(xiàn):抽獎抽獎粉絲流動V碼獲取mid獲取調(diào)用多日數(shù)據(jù)評論抽獎粉絲抽獎粉絲流動新粉抽獎舊粉抽獎結(jié)果新增變動取關(guān)變動數(shù)據(jù)儲存返回菜單圖3.6抽獎功能和粉絲流動功能邏輯圖 不同于前幾個功能的相對獨立,抽獎和粉絲流動這兩個功能的分支會有共同的數(shù)據(jù)需求,在設(shè)計程序邏輯的時候應(yīng)該注意,合理利用資源,實現(xiàn)一對多的函數(shù)調(diào)用,節(jié)省代碼量,提高效率。即粉絲抽獎和粉絲流動部分是需要用戶提供mid而不是bv號,但整體邏輯依舊和前部分的功能模塊類似。 下圖為用戶視頻信息查詢:獲取mid獲取mid用戶視頻信息瀏覽合法返回菜單排版打印各評論數(shù)視頻總量各bv號各標(biāo)題各播放量獲取數(shù)據(jù)是否圖3.7用戶視頻信息查詢 該功能提供用戶查看所有的視頻相關(guān)信息,邏輯設(shè)計為較精簡的交互模式,獲取請求后輸入mid,程序判斷數(shù)據(jù)合法性后,將內(nèi)容排版打印輸出,相對于前幾個功能的多分支,本功能邏輯簡單易懂。繪制完成主程序和功能模塊的邏輯設(shè)計后,可以開始進行爬蟲程序設(shè)計。4爬蟲程序具體設(shè)計流程4.1環(huán)境搭載 在有了需求和邏輯框架后,開始進入軟件設(shè)計環(huán)節(jié)。 首先是環(huán)境的搭載。本軟件是基于python開發(fā)的爬蟲程序,自然少不了python的安裝和環(huán)境構(gòu)建。第一步是安裝python。進入官網(wǎng)下載地址/downloads/windows,選擇對應(yīng)的32位或64位安裝包進行下載,然后根據(jù)提示進行安裝,需要注意安裝路徑的選擇和應(yīng)該勾選將python添加到PATH環(huán)境變量。安裝完后打開命令提示符CMD輸入python-V,若返回具體版本則為安裝成功。如下圖示:圖4.1安裝結(jié)果安裝完python,可以選擇直接開始代碼編寫,原生的python組件雖然好用,但有些簡潔,缺少了諸多豐富的功能和調(diào)試交互。Python也有許多IDE可供選擇,這里選擇pycharm作為集成開發(fā)環(huán)境進行代碼編寫。PyCharm作為知名度和用戶量都很高的python編譯器,在界面、交互、調(diào)試、管理等都比原生要更精致和易用。進入官網(wǎng)/pycharm/download/#section=windows,下載對應(yīng)版本,跟著指示安裝,同樣需要更新PATH環(huán)境變量。有專業(yè)版和社區(qū)版可供選擇,社區(qū)版面向個人開發(fā)者,是免費使用的。安裝后即可。打開pycharm新建project,進入project界面點擊file-new-pythonfile創(chuàng)建新的python文件。并手動添加解釋器。點擊右上角file-settings進入設(shè)置如圖示:圖4.2進入設(shè)置在project:項目名稱欄目下點擊projectinterpreter,可在右上方添加默認(rèn)解釋器或新建解釋器。如圖示:圖4.3添加解釋器至此,基礎(chǔ)的環(huán)境搭載完成。測試是否成功,輸入print('helloworld!'),點擊run按鈕運行,成功打印字符,如圖示:圖4.4測試pycharm 在軟件編寫時經(jīng)常會對多行代碼進行運行測試,每次都使用run運行的話會比較麻煩,因為之前寫好的代碼也會跟著運行,若每次都注釋掉效率也有所降低。我們可以使用ipython解決這一問題。 Ipython是python的一個交互式shell,相比默認(rèn)的shell功能更強大,也能很好地兼容pycharm,其特有的in-out模式可以支持指定代碼行的運行,對功能調(diào)試十分有益。安裝十分簡單,打開cmd輸入pipinstallipython等待安裝完成即可。若報錯失敗可檢查是不是pip工具沒有升級到最新版本。使用pipshowpip可以查看當(dāng)前pip的版本信息,若提示YoushouldconsiderUPgradingviathe'python-mpipinstall--UPgradepip'comm,直接復(fù)制引號內(nèi)容輸入更新即可。安裝成功后打開cmd輸入ipython,出現(xiàn)下圖In[1]即為成功。圖4.5測試ipython 打開pycharm選中任意一行代碼,右鍵選擇executeselectioninconsole,下方即會打開shell界面。圖4.6在pycharm中啟用ipython圖4.7啟用成功 如圖,可在shell界面進行代碼編寫測試。4.2模塊功能實現(xiàn)4.2.1實現(xiàn)評論獲取與查找 軟件環(huán)境搭載好后,開始進行代碼編寫。首先把目標(biāo)確定在如何獲取評論。使用Chrome瀏覽器打開嗶哩嗶哩,隨意點開一個視頻,這里應(yīng)該選擇評論較少的,因為首要目的是實現(xiàn)獲取,之后再解決抓取量的問題。若選擇大量評論的視頻進行測試很可能被嗶哩嗶哩網(wǎng)站監(jiān)測到,這對于爬蟲的開展無疑是無益的。點開視頻后按F12打開開發(fā)者工具調(diào)試界面,點擊network,按下Ctrl+R刷新網(wǎng)頁。可以看到網(wǎng)頁的所有網(wǎng)絡(luò)請求。如圖示:圖4.8找到請求 圖中可以看出,請求有很多個,一個個查找肯定可以找到評論相關(guān)的數(shù)據(jù)包,我們也可以使用左方的搜索功能,隨意復(fù)制一條評論進行搜索,結(jié)果如圖:圖4.9查看請求包 可以看到查詢到3條請求結(jié)果,進一步查看后發(fā)現(xiàn)第一條的reply就是我們想要的數(shù)據(jù)。點擊preview查看網(wǎng)頁返回的json包數(shù)據(jù),結(jié)果如圖:圖4.10返回包數(shù)據(jù)1圖4.11返回包數(shù)據(jù)2可以看到,data-replies-0下的content即為我們需要的評論數(shù)據(jù),此外member里有mid和用戶id,后續(xù)也會用到。mid為嗶哩嗶哩為每一位用戶編排的身份標(biāo)識,具有唯一性,后續(xù)進行數(shù)據(jù)處理可以以mid作為標(biāo)識符,也考慮到用戶的id可能會更改,以id為判別標(biāo)識不夠嚴(yán)謹(jǐn)。知道評論的請求名后,右鍵復(fù)制地址,開始找請求的api地址。如圖示:圖4.12復(fù)制鏈接地址 復(fù)制后打開網(wǎng)址,提示頁面未找到。如圖示:圖4.13訪問失敗可以理解成api地址被加工了。沒有關(guān)系,我們分析一下地址構(gòu)成。/x/v2/reply?callback=jQuery17208760019825264331_1586439746170&jsonp=jsonp&pn=1&type=1&oid=48979270&sort=2&_=1586439751697可以發(fā)現(xiàn)reply?后皆為“變量名-值”這一格式。一個個刪掉使用排除法可以找到正確的組合,但熟悉網(wǎng)頁爬蟲的可以知道,callback其實為回調(diào)函數(shù)。當(dāng)網(wǎng)頁運行時,一般經(jīng)過API調(diào)用庫里預(yù)備好的函數(shù)。但有些庫函數(shù)會請求網(wǎng)頁先傳回一個函數(shù),以便在合適的時候調(diào)用,完成對應(yīng)指示。這個被傳入后又被調(diào)用的函數(shù)就稱為回調(diào)函數(shù)(callbackfunction)。一般刪除就能獲得真實api地址,我們把它刪掉試試。得到如下結(jié)果:圖4.14找到正確api地址沒錯,這就是正確的aip地址,接下來開始分析變量。Api地址后的”&pn=1&type=1&oid=48979270&sort=2&_=1586439751697”,pn可以猜到為頁數(shù),后續(xù)也證明了準(zhǔn)確性。type、sort為狀態(tài),這個默認(rèn)配置即可,最后剩下的“oid”和“_”應(yīng)為各視頻的唯一變量。打開多個視頻進行比對后可驗證。那“oid”和“_”該如何獲取呢?在網(wǎng)上查詢嗶哩嗶哩的開放api接口后,得知“_”可以用“nohot=1”代替,效果是一樣的。而oid先不著急,以該視頻為例,oid是已知的。先繼續(xù)實現(xiàn)評論爬取。以api地址請求數(shù)據(jù),可以調(diào)用requests庫,用get函數(shù)獲取數(shù)據(jù)包,再調(diào)用json庫的loads函數(shù)把網(wǎng)頁返回的已編碼的json字符串解碼成python對象。如圖示:圖4.15請求成功Response[200]說明成功處理了請求。打印輸出的字符串也說明成功獲取到數(shù)據(jù)包。開始獲取評論數(shù)據(jù)。首先評論有多頁,應(yīng)該先寫一個遍歷來實現(xiàn)循環(huán)爬取。如何知道某個視頻的評論頁數(shù)呢?我們回到開發(fā)者調(diào)試窗口,可以找到page里的count即為主樓評論的數(shù)量,嗶哩嗶哩評論默認(rèn)顯示20條一頁,那么總頁數(shù)即為(count-1)//20+1,取整處理。接著應(yīng)該注意評論不僅有主樓,還有跟樓回復(fù),副樓時有時無,層數(shù)也不固定。副樓的數(shù)據(jù)是在主樓的replies下面的??梢杂胕f語句判斷,存在副樓時遍歷,以此下推。存儲數(shù)據(jù)時將用戶名和評論分別存放在列表中,方便后續(xù)調(diào)用查找。為什么不選擇字典呢?因為用戶名可能會重復(fù),字典在存儲重復(fù)用戶名的評論時新評論會頂?shù)襞f的,最終只保留一個。這也是字典的特性,鍵值對應(yīng),鍵唯一。起初我是用字典存儲的,發(fā)現(xiàn)怎么都抓不完整,才恍然大悟,改用列表。部分實現(xiàn)代碼如下:total_pages=(data['data']['page']['count']-1)//20+1lou=[]louid=[]forpageinrange(1,total_pages+1):r=requests.get(url)data=json.loads(r.text)foriindata['data']['replies']:lou.append(i['content']['message'])louid.append(i['member']['uname'])ifi['replies']!=None:forjini['replies']:lou.append(j['content']['message'])louid.append(j['member']['uname'])forx,yinzip(louid,lou):print(x,":",y) 試運行并交叉打印兩個列表,返回結(jié)果如圖:圖4.16爬取評論成功 獲取評論成功,可以看到主樓副樓都可以顯示出來,并且相同用戶的評論也都在紀(jì)錄。 接下來實現(xiàn)查找部分。排序功能對于大量評論數(shù)據(jù)的查看有著重要作用,我們使用python內(nèi)置的sorted函數(shù)來實現(xiàn)。需要注意sort的應(yīng)用對象為list,sorted可對所有可迭代的對象進行排序操作。為了全面我們還是使用sorted。changping=sorted(lou,key=lambdai:len(i),reverse=True)如上一行即可實現(xiàn)正序排列存儲到list[changping]中。接著是去重操作,評論里不乏有重復(fù)的顏文字,頂帖等等相同的回復(fù),我們可以利用for循環(huán)將評論列表與空list對比,若空list中沒有即加入list中,以此篩選掉重復(fù)的評論,代碼如下:foriinlou:ifinotinquchong:quchong.append(i)實現(xiàn)關(guān)鍵詞查找的方法也與其類似,在評論列表中用for循環(huán)遍歷關(guān)鍵詞,存在即存入新list中,代碼如下:f=[fforfinlouifguanciinf] 至此獲取評論與查詢部分編寫完成。4.2.2實現(xiàn)bv號獲取及視頻信息總覽 考慮到有的UP主發(fā)布視頻比較多,有時一個個翻bv號會很麻煩,因此新增一個功能,只需輸入mid即可自動獲取該UP主所有視頻的基本信息,包括bv號、名稱、播放量、評論數(shù)。在不改變原有程序邏輯的情況下,減少用戶操作步驟。 首先打開某個用戶的視頻頁面,使用前面獲取api的方法,查找到正確的返回數(shù)據(jù)包,如圖:圖4.17獲取返回包"/x/space/arc/search?mid=34497273&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp"對地址進行分析可得,ps為pagesize,指一頁的容量為30,pn為pagenumber,指頁數(shù),我們只需請求ps=30,pn=1和mid即可正確抓到第一頁的數(shù)據(jù),又因返回包中count里有視頻總量,如圖示:圖4.18找到視頻量信息 即可利用count//ps+1來遍歷爬取到全部頁數(shù)的數(shù)據(jù)。代碼編寫和獲取評論的思路類似,如下為部分代碼:r=requests.get(url)data=json.loads(r.text)total_pages=(data['data']['page']['count']-1)//30+1forpageinrange(1,total_pages+1):r=requests.get(url)data=json.loads(r.text)foriindata['data']['list']['vlist']:bid_list.append(i['bvid'])title_list.append(i['title'])play_list.append(i['play'])comment_list.append(i['comment'])forw,x,y,zinzip(bid_list,title_list,play_list,comment_list):print(w,":",x,"/播放量:",y,"/評論數(shù):",z) 運行測試,成功打印到所有數(shù)據(jù),如圖:圖4.19爬取結(jié)果到這里獲取bv號及視頻信息總覽功能編寫完成。4.2.3抽獎實現(xiàn)與粉絲流動部分抽獎功能分為按評論區(qū)回復(fù)抽獎、按新增關(guān)注者抽獎和按原關(guān)注者抽獎。按評論區(qū)抽獎我們可以繼續(xù)使用評論部分的api,請求到用戶mid和昵稱,存入一個字典dict中。需要注意,這里不同于評論獲取采用list存儲,在同一用戶有多次回復(fù)時,采用字典存儲可以保證其唯一性,不會多次錄入。鍵選擇為不變的mid,值則為可能改變的昵稱。yonghu[i['member']['mid']]=i['member']['uname']字典的寫入語法如上,其余部分與評論存儲相似,不過多說明。按新增關(guān)注者抽獎或原關(guān)注者抽獎則需要進入用戶關(guān)注界面,用同樣的方法在調(diào)試窗口找到api地址:/x/relation/followers?vmid={}&pn={}&ps={}&order=desc,pn和ps的含義和之前一樣,vmid經(jīng)過測試其實就是用戶mid。同樣的,在發(fā)送正確的請求后,我們得到數(shù)據(jù)包,將data-list里的關(guān)注者mid和昵稱存入字典中,測試結(jié)果如下:圖4.20用戶信息獲取成功這樣我們就得到了當(dāng)日的粉絲數(shù)據(jù)。但仍需在粉絲變動之后再獲取一遍或多遍,來對比篩選出新增的粉絲和一直存在的舊粉絲。使用pychon的file文件功能,open語法可以打開一個文件,調(diào)用pickle庫函數(shù)序列化字典,dump為寫入,load為讀取。方便以便下次調(diào)用。用法如下:file_name='day1.data'withopen(file_name,'wb')asf:pickle.dump(follow_dict,f)dict1=pickle.load(f)實現(xiàn)方法即為將操作分為兩個按鈕,第一次運行和第n次運行,分別存入day1和day2文件中,day1只寫入一次,day2不斷覆蓋。在有了多日數(shù)據(jù)后,我們可以定義一個比較函數(shù),使用for循環(huán)在day1里面遍歷day2的元素,若存在就跳過,不存在的將該元素寫入新list中。這個操作是可累計的的,新list(新增list、取關(guān)list、舊關(guān)list)會根據(jù)日數(shù)的累計而不斷刷新增加。遍歷邏輯為:day2存在而day1沒有的用戶即為新增粉絲;day1存在而day2沒有的用戶即為取關(guān)粉絲;day1排除掉取關(guān)粉絲后的用戶即為一直存在的舊粉絲。foriindict1.keys():try:follow_dict[i]except:bijiao1[i]=dict1[i]。如上為實現(xiàn)方法,利用try進行元素對比,跳過后在except下將數(shù)據(jù)存入新list中。3種list都是用同樣的框架獲取寫入的。在多次運行后,新增粉絲列表、取關(guān)列表、舊關(guān)注列表均獲取完畢,可以輸出結(jié)果給用戶查看,即實現(xiàn)了粉絲流動查詢。下面為運行結(jié)果,打印出新關(guān)注列表和取關(guān)列表:圖4.21打印新增和取關(guān)列表得知正確獲得后,進行最后的抽獎功能編寫。我們可以調(diào)用random庫,使用其choice函數(shù)對3種list列表進行隨機數(shù)獲取,在不同的需求下對相應(yīng)list進行操作,語法例子如下:xingyun=random.choice(list(yonghu))下面為其中一種抽獎的運行結(jié)果:圖4.22抽獎功能實現(xiàn)抽獎功能成功實現(xiàn),至此,多種方式的抽獎功能和粉絲流動查詢功能實現(xiàn)完畢。4.2.4mid的獲取和ab互轉(zhuǎn)功能實現(xiàn)完成前面的功能函數(shù)后,我們還有oid沒有解決。程序的理想操作是用戶選擇所需功能后,只需鍵入相關(guān)視頻bv號即可完成功能。但bv號與oid沒有關(guān)聯(lián),如何通過bv號獲得mid呢? 其實結(jié)論就是oid即av號。這也是我之前編寫代碼時發(fā)現(xiàn)的。本程序是在3月23日之前就編寫完成的,當(dāng)時的實現(xiàn)方法就是用戶輸入av號,因av號即mid,替換后即可實現(xiàn)各種功能。av號為嗶哩嗶哩網(wǎng)站之前為視頻編排的編號,用于唯一定位該視頻,即身份編號。但從2020年3月23日開始,嗶哩嗶哩正式啟用bv號取代av號,意在維護UP主的隱私等,提高安全性。但原有的av號功能依舊可用,因此本程序不僅要考慮舊視頻的適用,也要考慮3月23日后發(fā)布的視頻也能定位到?,F(xiàn)在視頻的網(wǎng)頁地址里參數(shù)已經(jīng)改成bv號,我們該怎么獲取到oid呢? 先打開一個3月23日前發(fā)布的視頻,打開調(diào)試窗口:圖4.23請求頭的oid可以看到header請求頭里的類型有個oid,再查看reply里的數(shù)據(jù),也有一個oid:圖4.24返回表單的oid因為視頻是以前發(fā)布的,我們知道其av號為av48979270。得出oid即av號。那么新發(fā)布的視頻是否也適用這一規(guī)則呢?打開一個3月23日后發(fā)布的視頻,查看發(fā)現(xiàn)其請求變量依然是oid。圖4.25新發(fā)布視頻的請求類型 可以作出猜測,oid是嗶哩嗶哩標(biāo)識視頻的真正編號,之前也作為av號提供給用戶作為搜索字符,并且在bv號更新后,依舊適用,只是av號不再顯示了。 開始驗證,打開調(diào)試窗口,Ctrl+R,不滾動鼠標(biāo)搜索視頻標(biāo)題,(請求靜態(tài)頁面的數(shù)據(jù)包),查看結(jié)果如下:圖4.26新發(fā)布視頻的請求類型 可以看到返回表單里aid與上方的oid相同。也證明了嗶哩嗶哩在更改bv號后依舊是使用oid進行視頻管理的。接下來就簡單了,拿到api地址,通過輸入bv號請求該返回包下的aid,即可獲得mid,實現(xiàn)前面的功能模塊。代碼如下:bvid=input()r=requests.get("/x/web-interface/view?bvid="+bvid)data=json.loads(r.text)aid=data['data']['aid']oid=aid 由此我們解決了oid的獲取問題。在此應(yīng)當(dāng)多編寫一個av號與bv號互相轉(zhuǎn)換的功能,方便需要的用戶。如上我們已經(jīng)實現(xiàn)bv號轉(zhuǎn)為av號的功能,反過來也一樣。在api地址上將bvid改為aid,在用戶輸入av號后請求該地址拿到data里的bvid,即為bv號。測試結(jié)果如下:圖4.27實現(xiàn)轉(zhuǎn)換功能 成功實現(xiàn)轉(zhuǎn)換功能,功能模塊基本完成,開始編寫程序框架。4.2.5程序框架實現(xiàn) 依據(jù)前面繪制的程序邏輯流程圖,程序?qū)⒈辉O(shè)計成運行-進入初始界面-進入菜單-實現(xiàn)功能-返回菜單-繼續(xù)執(zhí)行或者退出。每一步操作中途都可退出返回菜單頁或者直接退出程序。初始界面主要由print函數(shù)構(gòu)成,內(nèi)容包含軟件標(biāo)題,用途,制作者信息,操作須知等等文本提示信息。待用戶確認(rèn)完成后,輸入指令進入功能菜單。因功能菜單分支較多,要梳理好各分支的邏輯走向,我決定用while函數(shù)來構(gòu)造菜單,實現(xiàn)多分支的循環(huán)和打破。具體框架如下示例程序:whilea:dosthifb==1:dosthifc==1:whiled:dosthife==1:continueife!=0:breakbreak else:ifb!=1break 最外層的while充當(dāng)菜單,第一層if判斷語句實現(xiàn)一級菜單,第二層if判斷語句實現(xiàn)二級菜單……以此類推以實現(xiàn)多級菜單。合理套用continue和break即可實現(xiàn)簡單的多級菜單。而有一些分支需要在不跳出當(dāng)前層級菜單的情況下實現(xiàn)重復(fù)循環(huán),比如對評論的關(guān)鍵詞查找,用戶通常會進行多次查詢,我們應(yīng)當(dāng)提供合適的邏輯構(gòu)架,以實現(xiàn)對象需求??梢栽诖渭塱f判斷下嵌套多個while,比如: ifa==1: whilea:dosth ifb==1:continue ifb==0: break ifa==2: 在次級判斷條件當(dāng)a==1時,使用whilea作為自循環(huán)的條件,因為a已經(jīng)賦值具有意義,所以whilea可以理解成總是符合循環(huán)條件的循環(huán)體,即不主動break時會一直重復(fù)運行。確定循環(huán)的構(gòu)成后,開始往結(jié)構(gòu)里添加實際判斷條件和函數(shù)。 前面完成的各部分功能函數(shù)這時就可以進行分類打包,等待調(diào)用。 使用def函數(shù)對各部分功能進行定義,放在程序最前,等待循環(huán)體調(diào)用。def語法如下: defwater(a,b,c...): dosth returnd,e,f... water為定義的函數(shù)名,后接參數(shù),參數(shù)數(shù)量可變,完成功能語句后return對象。調(diào)用時使用water(x)或x=water(a)等形式即可獲得結(jié)果。這里附上一個功能例子: defb2a(bvid):r=requests.get("/x/web-interface/view?bvid="+bvid)data=json.loads(r.text)ifdata['code']==0:aid=data['data']['aid']returnaidreturn"抱歉!無法找到該視頻,請重試"這里定義了名為b2a的函數(shù),其形參為bvid,返回的數(shù)據(jù)為aid或者一段字符串。函數(shù)的功能是輸入bv號,返回av號,當(dāng)程序里某個部分需要調(diào)用時,使用print(str(b2a(bvid)))打印或者賦值a=str(b2a(bvid))即可。需要注意函數(shù)返回的數(shù)據(jù)和打印/賦值的對象數(shù)據(jù)類型應(yīng)該相同,否則會報錯。4.2.6邏輯改善及bug處理 在框架和功能函數(shù)編寫完成后,結(jié)合兩者,獲得基礎(chǔ)的完整程序。但運行后會有很多錯誤,這是不可避免的。開始完善邏輯和處理bug。 首先是用戶輸入指令時,原先設(shè)計的判斷條件為: a=int(input()) ifa==1: dosth ifa==2: … 這雖然高效簡潔,但沒考慮到用戶可能錯誤鍵入非阿拉伯?dāng)?shù)字的其他字符,導(dǎo)致一旦如此程序?qū)⒅苯油顺觥H魧nt類型的input改為str或正常input先對輸入字符進行判斷,因字母符號等無法與整型數(shù)據(jù)對比,if后的判斷類型也要修改,那么面對整個程序的諸多判斷分支,修改會異常麻煩。三番思考后,我想到了先以input接收輸入,再將if條件的判斷符存入元組數(shù)據(jù)中,將兩者都轉(zhuǎn)換為str類型,就可以實現(xiàn)全字符的自由對比,最后把a轉(zhuǎn)換為int類型,即可不改動判斷條件對輸入判斷進行改良,代碼如下:a=input()flag=(0,1,2,3…)whilebnotinstr(flag):print("輸入錯誤!請重新輸入!")a=input()a=int(b)ifa==1:ifa==2:…如上即可在不改動判斷結(jié)構(gòu)的情況下,實現(xiàn)鍵入指令的字符判斷,解決輸入非數(shù)字的指令程序崩潰的問題。在調(diào)用各定義的函數(shù)塊時,若輸入錯誤的/不符合規(guī)范的數(shù)據(jù),函數(shù)無法return正確值,會導(dǎo)致程序無法繼續(xù)崩潰退出。這也是由于為對定義函數(shù)進行操作判斷。defbv_inf_get(mid):bid_list=[],title_list=[],play_list=[],comment_list=[],count_num=[]url=("/x/space/arc/search?mid="+mid+"&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp")r=requests.get(url)data=json.loads(r.text)total_pages=data['data']['page']['count']//30+1count_num=data['data']['page']['count']forpageinrange(1,total_pages+1):time.sleep(0.1)print('電磁炮發(fā)射中(進度){}'.format(page),'/',total_pages)r=requests.get(url)data=json.loads(r.text)foriindata['data']['list']['vlist']:bid_list.append(i['bvid'])title_list.append(i['title'])play_list.append(i['play'])comment_list.append(i['comment'])returnbid_list,title_list,play_list,comment_list,count_num如上實行視頻數(shù)據(jù)獲取的定義函數(shù)bv_inf_get,在輸入錯誤的mid后,程序會報錯崩潰。解決方法查看正確與錯誤返回包的區(qū)別。如圖示:圖4.28錯誤的返回碼圖4.29正確的返回碼 可以看到兩者返回的code數(shù)值不同,那就可以根據(jù)code作出if判斷,若為正確return結(jié)果,錯誤則return“輸入出錯!”,最后在調(diào)用函數(shù)時,加一個判斷return的值即可解決因錯誤鍵入而崩潰的問題。 在多層while構(gòu)建的系統(tǒng)運作時,經(jīng)常出現(xiàn)層數(shù)過多而忘記在末端添加足夠的break而導(dǎo)致死循環(huán),只能細(xì)心排查,查漏補缺。 大致問題解決后,開始添加反爬處理。嗶哩嗶哩對該程序所需的接口開放較為友好,經(jīng)過測試不在短時間內(nèi)進行大量爬取時,嗶哩嗶哩不會對爬蟲作出明顯限制,但我們還是應(yīng)該做好延時,為服務(wù)器減輕壓力。調(diào)用time庫的sleep功能對爬取進行延時設(shè)定,根據(jù)需求每幾秒發(fā)送一次請求,可為設(shè)置毫秒,如0.1、0.5秒等等,在不過多等待的情況下減輕服務(wù)器承載。4.2.7編寫完成打包程序 程序編寫完成后,準(zhǔn)備進行打包。 將python工程文件打包成可執(zhí)行文件exe,不僅方便測試,用戶使用時也不用額外搭建環(huán)境,可以直接在Windows下使用。 這里選擇pyinstaller作為打包工具,但其不是默認(rèn)組件,我們需要手動安裝。進入pyinstaller官網(wǎng):/downloads.html,如下圖:圖4.30pyinstaller官網(wǎng)可見其提示便捷安裝方法為cmd輸入pipinstallpyinstaller,或者在未來使用pipinstall--upgradepyinstaller指令更新。若順利安裝完成,結(jié)果將如圖示:圖4.31安裝pyinstaller 若提示報錯安裝失敗,可能為build環(huán)境依賴失敗,解決方法為線下載安裝包,下拉官網(wǎng)網(wǎng)頁點擊下載:圖4.32在線下載pyinstaller包 下載后打開cmd,在文件路徑輸入pythonsetup.pyinstall即可安裝成功。安裝完畢后,將pyinstaller的安裝路徑添加到PATH環(huán)境變量中。之后把項目關(guān)聯(lián)py文件、ico圖標(biāo)(可選,圖標(biāo)格式應(yīng)為ico否則會報錯)都復(fù)制到同一目錄下,按住shift點擊右鍵在當(dāng)前路徑打開powershell,輸入pyinstaller-F-iC:\路徑\圖標(biāo).ico項目名稱.py進行打包。需要注意,若過程文件調(diào)用了第三方庫,需要將相關(guān)庫文件放入python的庫文件夾里。完成后如圖:圖4.33輸入打包指令圖4.34打包成功完成后該路徑下會多出三個文件夾__pycache__、build、dist和一個spec格式的同名配置文件,dist文件夾里就是打包完成的exe可執(zhí)行文件。試運行軟件,成功。測試過程會在后續(xù)展示。5軟件演示與測試5.1測試環(huán)境Windows10,python3.7.4,pycharm2019.1.3。5.2步驟演示與測試結(jié)果 打開exe軟件,進入初始界面,按1可查看使用說明。圖5.1軟件主菜單 輸入0進入功能菜單后,對不同的字符進行測試,結(jié)果如下:圖5.2非法字符判斷結(jié)果輸入1進入av-bv號互轉(zhuǎn)頁面,分別測試兩個轉(zhuǎn)換選項,并依次輸入合法與錯誤的av/bv號,測試是否正確返回結(jié)果,并對返回菜單的指令進行各種字符測試,測試結(jié)果成功,如圖示:圖5.3av號轉(zhuǎn)為bv號測試結(jié)果圖5.4bv號轉(zhuǎn)為av號測試結(jié)果返回功能菜單輸入2進入評論查看界面,分別測試查看昵稱+評論和單獨查看評論的功能,測試結(jié)果成功顯示,如下圖:圖5.5查看昵稱和評論測試結(jié)果圖5.6只查看評論測試結(jié)果返回功能菜單輸入3進入評論查找界面,分別測試所有功能,即長評論查看,精簡評論查看和關(guān)鍵詞查找。測試結(jié)果長評排序成功,精簡評論去重復(fù)評論除成功,關(guān)鍵詞查找到時返回正確結(jié)果,查無關(guān)鍵詞會提示重試;無論查詢成功與否都可以繼續(xù)查詢或者返回主菜單。如下圖:圖5.7長評論測試結(jié)果圖5.8精簡評論測試結(jié)果圖5.9查找關(guān)鍵詞測試結(jié)果返回功能菜單輸入4進入抽獎界面,即按評論區(qū)抽獎,按新增/舊粉絲抽獎。輸入1測試第一個功能,輸入bv號后,正確抽取到一名用戶,并且可根據(jù)情況重新抽取或者返回菜單,對輸入錯誤指令的判斷也成功識別,如下圖:圖5.10抽獎功能測試結(jié)果1 第二個粉絲抽取功能需要多次錄入數(shù)據(jù)進行比對,測試首次、中間次錄入成功結(jié)果如下:圖5.11首日數(shù)據(jù)錄入測試結(jié)果圖5.12中間日數(shù)據(jù)錄入測試結(jié)果測試截止日錄入數(shù)據(jù)后的兩種抽獎情況,從新增關(guān)注/舊關(guān)注中抽取,若未存在表單則提醒無法抽取,并且詢問是否返回上一級重新抽取,測試成功,結(jié)果如下:圖5.13抽獎功能測試結(jié)果2 返回功能菜單輸入5進入粉絲流動瀏覽界面,測試第一日爬取成功,如圖:圖5.14首日數(shù)據(jù)錄入結(jié)果測試第二日后的錄入情況,并查看兩個分支的粉絲情況,可返回上一層查看另一結(jié)果,如下:圖5.15次日即粉絲流動查詢結(jié)果返回菜單,輸入6進入視頻瀏覽或bv號獲取界面,分別輸入正確與錯誤的mid進行測試。返回結(jié)果正常,該用戶的視頻總數(shù)、視頻標(biāo)題、bv號、播放量、評論數(shù)都正確輸出,并會提示進度,在輸入錯誤的mid后提示查無用戶,并提示用戶重新查找,如下圖:圖5.16bv號獲取及視頻總覽測試結(jié)果到此軟件全部功能流程均已測試成功,沒有報錯。6總結(jié)6.1項目開發(fā)總結(jié)這次程序開發(fā)對用戶需求邏輯進行了深入的分析,最終也實現(xiàn)了整個過程。從分析用戶的需求,基于python環(huán)境編譯,到考慮如何結(jié)合相關(guān)模塊及函數(shù)庫實現(xiàn)期望功能,終于開發(fā)出一款操作簡單,邏輯清晰,查詢便捷和具有良好的交互式體驗的查詢軟件。使用成本良好,無需額外搭載平臺,只需Windows10即可直接使用,受到了用戶的好評。適用于全體嗶哩嗶哩網(wǎng)站的用戶,包括觀眾和UP主等等。實現(xiàn)過程遇到了許多難點和報錯,在導(dǎo)師和網(wǎng)上查詢的幫助下不斷地探索答案,也讓我更加熟悉開發(fā)過程,學(xué)到更多的知識和技巧。在設(shè)計菜單循環(huán)時,一開始我并沒有系統(tǒng)地定義好各功能函數(shù),導(dǎo)致需要用到時得重復(fù)輸入相同的代碼行和進行更多的if語句判斷,這也是一個很不好的習(xí)慣,導(dǎo)致代碼容易報錯,結(jié)構(gòu)紊亂,后期也難以維護。最終我重新定義了各分函數(shù)便于主體調(diào)用,并優(yōu)化了菜單邏輯,減少判斷,提高軟件穩(wěn)定性。6.2不足與展望雖然軟件實現(xiàn)了多個用戶期望的功能,但實際中還有更多的需求和未知變化。后期維護更新依然需要解決許多問題。比如評論量巨大的數(shù)據(jù)爬取,即使設(shè)置了爬取間隔,總耗時也依舊很長,需要幾個小時甚至更久。在無法獲得服務(wù)器完全訪問權(quán)限的前提下如何提高爬蟲效率,是每一位爬蟲編寫者需要考慮的長遠(yuǎn)問題。參考文獻[1]Winter.中文搜索引擎技術(shù)解密:網(wǎng)絡(luò)蜘蛛[M].北京:人民郵電出版社,2014年[2]Wisenut.WisenutSearchEnginewhitepaper[M].北京:中國電力出版社,2014年[3]羅剛王振東.自己動手寫網(wǎng)絡(luò)爬蟲[M].北京:機械工業(yè)出版社。2002年[4]李曉明,閆宏飛,王繼民.搜索引擎:原理、技術(shù)與系統(tǒng)—華夏英才基金學(xué)術(shù)文庫[M].北京:科學(xué)出版社,2005年[5]WesleyChun.CorePythonProgramming[M].PrenticeHall,2006[6]R.?SalakhutdinovandA.?Mnih,ProbabilisticMatrixFactorization.?InProceedingsofNIPS.?2007[7]NajorkM,WienerJL.Breadth-firstcrawlingyieldshigh-qualitypages[C]//Proceedingsofthe10thinternationalconferenceonWorldWideWeb.ACM,2001:114-118[8]ChenX,LiWJ,ZhaoTJ,etal.DesignoftheDistributedWebCrawler[J].Ad-vancedMaterialsResearch,2011,204-210:1454-1458[9]搜索引擎技術(shù)基礎(chǔ)[M].北京:清華大學(xué)出版社,2010年致謝大學(xué)生活如白駒過隙,在歡笑和痛苦中,四年也顯得不那么長。我在大學(xué)期間遇到了形形色色的人和事物,他們真實、生動而精彩,這些相遇的積累讓我了解到世界的寬廣。也明白了知識并非俯拾皆是,在相對自由的大學(xué)環(huán)境中,要想提高自己唯有自律和主動。圖書館淡淡的書本味道,輕盈的腳步聲,陽光透過窗映射在書上,字里行間也變得有了溫度,偶爾飄來咖啡館的香氣,仿佛咖啡因在刺激腦海。這個大家默契營造的安靜氛圍,都讓我感到愜意和自在。論文的編寫過程,導(dǎo)師也給了我很多的幫助和建議,寬容的態(tài)度和誨人不倦的指導(dǎo)精神都讓我收益良多。在畢業(yè)論文即將完成的此刻,向?qū)熀退薪處煿ぷ髡弑硎局孕牡母兄x和崇高的敬意!感謝我的父母,是他們給了我不斷的支持,樹立我的價值觀;感謝我的舍友,是他們的寬容讓我改掉了許多生活上的習(xí)慣;感謝我的班級同學(xué),是他們在大學(xué)生活中給了我方方面面的幫助;感謝我的各位老師,感謝他們無私的傳授知識和咨詢;感謝大學(xué)里遇到的每一個人,與他們相識真的很值得。最后,感謝母校提供了我良好的學(xué)習(xí)和生活環(huán)境,也希望母校越來越好,培養(yǎng)出更多的后輩。我將勇敢面對新的社會生活,迎接挑戰(zhàn)!

電腦故障檢測卡代碼表

1、特殊代碼"00"和"ff"及其它起始碼有三種情況出現(xiàn):

①已由一系列其它代碼之后再出現(xiàn):"00"或"ff",則主板ok。

②如果將cmos中設(shè)置無錯誤,則不嚴(yán)重的故障不會影響bios自檢的繼續(xù),而最終出現(xiàn)"00"或"ff"。

③一開機就出現(xiàn)"00"或"ff"或其它起始代碼并且不變化則為主板沒有運行起來。

2、本表是按代碼值從小到大排序,卡中出碼順序不定。

3、未定義的代碼表中未列出。

4、對于不同bios(常用ami、award、phoenix)用同一代碼代表的意義不同,因此應(yīng)弄清您所檢測的電腦是屬于哪一種類型的bios,您可查閱您的電腦使用手冊,或從主板上的bios芯片上直接查看,也可以在啟動屏幕時直接看到。

5、有少數(shù)主板的pci槽只有一部分代碼出現(xiàn),但isa槽有完整自檢代碼輸出。且目前已發(fā)現(xiàn)有極個別原裝機主板的isa槽無代碼輸出,而pci槽則有完整代碼輸出,故建議您在查看代碼不成功時,將本雙槽卡換到另一種插槽試一下。另外,同一塊主板的不同pci槽,有的槽有完整代碼送出,如dell810主板只有靠近cpu的一個pci槽有完整代碼顯示,一直變化到"00"或"ff",而其它pci槽走到"38"后則不繼續(xù)變化。

6、復(fù)位信號所需時間isa與pci不一定同步,故有可能isa開始出代碼,但pci的復(fù)位燈還不熄,故pci代碼停要起始代碼上。

代碼對照表

00.已顯示系統(tǒng)的配置;即將控制INI19引導(dǎo)裝入。

01處理器測試1,處理器狀態(tài)核實,如果測試失敗,循環(huán)是無限的。處理器寄存器的測試即將開始,不可屏蔽中斷即將停用。CPU寄存器測試正在進行或者失敗。

02確定診斷的類型(正?;蛘咧圃欤?。如果鍵盤緩沖器含有數(shù)據(jù)就會失效。停用不可屏蔽中斷;通過延遲開始。CMOS寫入/讀出正在進行或者失靈。

03清除8042鍵盤控制器,發(fā)出TESTKBRD命令(AAH)通電延遲已完成。ROMBIOS檢查部件正在進行或失靈。

04使8042鍵盤控制器復(fù)位,核實TESTKBRD。鍵盤控制器軟復(fù)位/通電測試??删幊涕g隔計時器的測試正在進行或失靈。

05如果不斷重復(fù)制造測試1至5,可獲得8042控制狀態(tài)。已確定軟復(fù)位/通電;即將啟動ROM。DMA初如準(zhǔn)備正在進行或者失靈。

06使電路片作初始準(zhǔn)備,停用視頻、奇偶性、DMA電路片,以及清除DMA電路片,所有頁面寄存器和CMOS停機字節(jié)。已啟動ROM計算ROMBIOS檢查總和,以及檢查鍵盤緩沖器是否清除。DMA初始頁面寄存器讀/寫測試正在進行或失靈。

07處理器測試2,核實CPU寄存器的工作。ROMBIOS檢查總和正常,鍵盤緩沖器已清除,向鍵盤發(fā)出BAT(基本保證測試)命令。.

08使CMOS計時器作初始準(zhǔn)備,正常的更新計時器的循環(huán)。已向鍵盤發(fā)出BAT命令,即將寫入BAT命令。RAM更新檢驗正在進行或失靈。

09EPROM檢查總和且必須等于零才通過。核實鍵盤的基本保證測試,接著核實鍵盤命令字節(jié)。第一個64KRAM測試正在進行。

0A使視頻接口作初始準(zhǔn)備。發(fā)出鍵盤命令字節(jié)代碼,即將寫入命令字節(jié)數(shù)據(jù)。第一個64KRAM芯片或數(shù)據(jù)線失靈,移位。

0B測試8254通道0。寫入鍵盤控制器命令字節(jié),即將發(fā)出引腳23和24的封鎖/解鎖命令。第一個64KRAM奇/偶邏輯失靈。

0C測試8254通道1。鍵盤控制器引腳23、24已封鎖/解鎖;已發(fā)出NOP命令。第一個64KRAN的地址線故障。

0D1、檢查CPU速度是否與系統(tǒng)時鐘相匹配。2、檢查控制芯片已編程值是否符合初設(shè)置。3、視頻通道測試,如果失敗,則鳴喇叭。已處理NOP命令;接著測試CMOS停開寄存器。第一個64KRAM的奇偶性失靈

0E測試CMOS停機字節(jié)。CMOS停開寄存器讀/寫測試;將計算CMOS檢查總和。初始化輸入/輸出端口地址。

0F測試擴展的CMOS。已計算CMOS檢查總和寫入診斷字節(jié);CMOS開始初始準(zhǔn)備。.

10測試DMA通道0。CMOS已作初始準(zhǔn)備,CMOS狀態(tài)寄存器即將為日期和時間作初始準(zhǔn)備。第一個64KRAM第0位故障。

11測試DMA通道1。CMOS狀態(tài)寄存器已作初始準(zhǔn)備,即將停用DMA和中斷控制器。第一個64DKRAM第1位故障。

12測試DMA頁面寄存器。停用DMA控制器1以及中斷控制器1和2;即將視頻顯示器并使端口B作初始準(zhǔn)備。第一個64DKRAM第2位故障。

13測試8741鍵盤控制器接口。視頻顯示器已停用,端口B已作初始準(zhǔn)備;即將開始電路片初始化/存儲器自動檢測。第一個64DKRAM第3位故障。

14測試存儲器更新觸發(fā)電路。電路片初始化/存儲器處自動檢測結(jié)束;8254計時器測試即將開始。第一個64DKRAM第4位故障。

15測試開頭64K的系統(tǒng)存儲器。第2通道計時器測試了一半;8254第2通道計時器即將完成測試。第一個64DKRAM第5位故障。

16建立8259所用的中斷矢量表。第2通道計時器測試結(jié)束;8254第1通道計時器即將完成測試。第一個64DKRAM第6位故障。

17調(diào)準(zhǔn)視頻輸入/輸出工作,若裝有視頻BIOS則啟用。第1通道計時器測試結(jié)束;8254第0通道計時器即將完成測試。第一個64DKRAM第7位故障。

18測試視頻存儲器,如果安裝選用的視頻BIOS通過,由可繞過。第0通道計時器測試結(jié)束;即將開始更新存儲器。第一個64DKRAM第8位故障。

19測試第1通道的中斷控制器(8259)屏蔽位。已開始更新存儲器,接著將完成存儲器的更新。第一個64DKRAM第9位故障。

1A測試第2通道的中斷控制器(8259)屏蔽位。正在觸發(fā)存儲器更新線路,即將檢查15微秒通/斷時間。第一個64DKRAM第10位故障。

1B測試CMOS電池電平。完成存儲器更新時間30微秒測試;即將開始基本的64K存儲器測試。第一個64DKRAM第11位故障。

1C測試CMOS檢查總和。.第一個64DKRAM第12位故障。

1D調(diào)定CMOS配置。.第一個64DKRAM第13位故障。

1E測定系統(tǒng)存儲器的大小,并且把它和CMOS值比較。.第一個64DKRAM第14位故障。

1F測試64K存儲器至最高640K。.第一個64DKRAM第15位故障。

20測量固定的8259中斷位。開始基本的64K存儲器測試;即將測試地址線。從屬DMA寄存器測試正在進行或失靈。

21維持不可屏蔽中斷(NMI)位(奇偶性或輸入/輸出通道的檢查)。通過地址線測試;即將觸發(fā)奇偶性。主DMA寄存器測試正在進行或失靈。

22測試8259的中斷功能。結(jié)束觸發(fā)奇偶性;將開始串行數(shù)據(jù)讀/寫測試。主中斷屏蔽寄存器測試正在進行或失靈。

23測試保護方式8086虛擬方式和8086頁面方式?;镜?4K串行數(shù)據(jù)讀/寫測試正常;即將開始中斷矢量初始化之前的任何調(diào)節(jié)。從屬中斷屏蔽存器測試正在進行或失靈。

24測定1MB以上的擴展存儲器。矢量初始化之前的任何調(diào)節(jié)完成,即將開始中斷矢量的初始準(zhǔn)備。設(shè)置ES段地址寄存器注冊表到內(nèi)存高端。

25測試除頭一個64K之后的所有存儲器。完成中斷矢量初始準(zhǔn)備;將為旋轉(zhuǎn)式斷續(xù)開始讀出8042的輸入/輸出端口。裝入中斷矢量正在進行或失靈。

26測試保護方式的例外情況。讀出8042的輸入/輸出端口;即將為旋轉(zhuǎn)式斷續(xù)開始使全局?jǐn)?shù)據(jù)作初始準(zhǔn)備。開啟A20地址線;使之參入尋址。

27確定超高速緩沖存儲器的控制或屏蔽RAM。全1數(shù)據(jù)初始準(zhǔn)備結(jié)束;接著將進行中斷矢量之后的任何初始準(zhǔn)備。鍵盤控制器測試正在進行或失靈。

28確定超高速緩沖存儲器的控制或者特別的8042鍵盤控制器。完成中斷矢量之后的初始準(zhǔn)備;即將調(diào)定單色方式。CMOS電源故障/檢查總和計算正在進行。

29.已調(diào)定單色方式,即將調(diào)定彩色方式。CMOS配置有效性的檢查正在進行。

2A使鍵盤控制器作初始準(zhǔn)備。已調(diào)定彩色方式,即將進行ROM測試前的觸發(fā)奇偶性。置空64K基本內(nèi)存。

2B使磁碟驅(qū)動器和控制器作初始準(zhǔn)備。觸發(fā)奇偶性結(jié)束;即將控制任選的視頻ROM檢查前所需的任何調(diào)節(jié)。屏幕存儲器測試正在進行或失靈。

2C檢查串行端口,并使之作初始準(zhǔn)備。完成視頻ROM控制之前的處理;即將查看任選的視頻ROM并加以控制。屏幕初始準(zhǔn)備正在進行或失靈。

2D檢測并行端口,并使之作初始準(zhǔn)備。已完成任選的視頻ROM控制,即將進行視頻ROM回復(fù)控制之后任何其他處理的控制。屏幕回掃測試正在進行或失靈。

2E使硬磁盤驅(qū)動器和控制器作初始準(zhǔn)備。從視頻ROM控制之后的處理復(fù)原;如果沒有發(fā)現(xiàn)EGA/VGA就要進行顯示器存儲器讀/寫測試。檢測視頻ROM正在進行。

2F檢測數(shù)學(xué)協(xié)處理器,并使之作初始準(zhǔn)備。沒發(fā)現(xiàn)EGA/VGA;即將開始顯示器存儲器讀/寫測試。.

30建立基本內(nèi)存和擴展內(nèi)存。通過顯示器存儲器讀/寫測試;即將進行掃描檢查。認(rèn)為屏幕是可以工作的。

31檢測從C800:0至EFFF:0的選用ROM,并使之作初始準(zhǔn)備。顯示器存儲器讀/寫測試或掃描檢查失敗,即將進行另一種顯示器存儲器讀/寫測試。單色監(jiān)視器是可以工作的。

32對主板上COM/LTP/FDD/聲音設(shè)備等I/O芯片編程使之適合設(shè)置值。通過另一種顯示器存儲器讀/寫測試;卻將進行另一種顯示器掃描檢查。彩色監(jiān)視器(40列)是可以工作的。

33.視頻顯示器檢查結(jié)束;將開始利用調(diào)節(jié)開關(guān)和實際插卡檢驗顯示器的關(guān)型。彩色監(jiān)視器(80列)是可以工作的。

34.已檢驗顯示器適配器;接著將調(diào)定顯示方式。計時器滴答聲中斷測試正在進行或失靈。35.完成調(diào)定顯示方式;即將檢查BIOSROM的數(shù)據(jù)區(qū)。停機測試正在進行或失靈。

36.已檢查BIOSROM數(shù)據(jù)區(qū);即將調(diào)定通電信息的游標(biāo)。門電路中A-20失靈。

37.識別通電信息的游標(biāo)調(diào)定已完成;即將顯示通電信息。保護方式中的意外中斷。

38.完成顯示通電信息;即將讀出新的游標(biāo)位置。RAM測試正在進行或者地址故障>FFFFH。

39.已讀出保存游標(biāo)位置,即將顯示引用信息串。.

3A.引用信息串顯示結(jié)束;即將顯示發(fā)現(xiàn)信息。間隔計時器通道2測試或失靈。

3B用OPTI電路片(只是486)使輔助超高速緩沖存儲器作初始準(zhǔn)備。已顯示發(fā)現(xiàn)<ESC>信息;虛擬方式,存儲器測試即將開始。按日計算的日歷時鐘測試正在進行或失靈。

3C建立允許進入CMOS設(shè)置的標(biāo)志。.串行端口測試正在進行或失靈。

3D初始化鍵盤/PS2鼠標(biāo)/PNP設(shè)備及總內(nèi)存節(jié)點。.并行端口測試正在進行或失靈。

3E嘗試打開L2高速緩存。.數(shù)學(xué)協(xié)處理器測試正在進行或失靈。

40.已開始準(zhǔn)備虛擬方式的測試;即將從視頻存儲器來檢驗。調(diào)整CPU速度,使之與外圍時鐘精確匹配。

41中斷已打開,將初始化數(shù)據(jù)以便于0:0檢測內(nèi)存變換(中斷控制器或內(nèi)存不良)從視頻存儲器檢驗之后復(fù)原;即將準(zhǔn)備描述符表。系統(tǒng)插件板選擇失靈。

42顯示窗口進入SETUP。描述符表已準(zhǔn)備好;即將進行虛擬方式作存儲器測試。擴展CMOSRAM故障。

43若是即插即用BIOS,則串口、并口初始化。進入虛擬方式;即將為診斷方式實現(xiàn)中斷。.44.已實現(xiàn)中斷(如已接通診斷開關(guān);即將使數(shù)據(jù)作初始準(zhǔn)備以檢查存儲器在0:0返轉(zhuǎn)。)BIOS中斷進行初始化。

45初始化數(shù)學(xué)協(xié)處理器。數(shù)據(jù)已作初始準(zhǔn)備;即將檢查存儲器在0:0返轉(zhuǎn)以及找出系統(tǒng)存儲器的規(guī)模。.

46.測試存儲器已返回;存儲器大小計算完畢,即將寫入頁面來測試存儲器。檢查只讀存儲器ROM版本。

47.即將在擴展的存儲器試寫頁面;即將基本640K存儲器寫入頁面。

48.已將基本存儲器寫入頁面;即將確定1MB以上的存儲器。視頻檢查,CMOS重新配置。

49.找出1BM以下的存儲器并檢驗;即將確定1MB以上的存儲器。.

4A.找出1MB以上的存儲器并檢驗;即將檢查BIOSROM數(shù)據(jù)區(qū)。進行視頻的初始化。

4B.BIOSROM數(shù)據(jù)區(qū)的檢驗結(jié)束,即將檢查<ESC>和為軟復(fù)位清除1MB以上的存儲器。.4C.清除1MB以上的存儲器(軟復(fù)位)即將清除1MB以上的存儲器.屏蔽視頻BIOSROM。.4D。已清除1MB以上的存儲器(軟復(fù)位);將保存存儲器的大小。.

4E若檢測到有錯誤;在顯示器上顯示錯誤信息,并等待客戶按<F1>鍵繼續(xù)。開始存儲器的測試:(無軟復(fù)位);即將顯示第一個64K存儲器的測試。顯示版權(quán)信息。

4F讀寫軟、硬盤數(shù)據(jù),進行DOS引導(dǎo)。開始顯示存儲器的大小,正在測試存儲器將使之更新;將進行串行和隨機的存儲器測試。.

50將當(dāng)前BIOS監(jiān)時區(qū)內(nèi)的CMOS值存到CMOS中。完成1MB以下的存儲器測試;即將高速存儲器的大小以便再定位和掩蔽。將CPU類型和速度送到屏幕。

51.測試1MB以上的存儲器。.

52所有ISA只讀存儲器ROM進行初始化,最終給PCI分配IRQ號等初始化工作。已完成1MB以上的存儲器測試;即將準(zhǔn)備回到實址方式。進入鍵盤檢測。

53如果不是即插即用BIOS,則初始化串口、并口和設(shè)置時種值。保存CPU寄存器和存儲器的大小,將進入實址方式。.

54.成功地開啟實址方式;即將復(fù)原準(zhǔn)備停機時保存的寄存器。掃描“打擊鍵”

55.寄存器已復(fù)原,將停用門電路A-20的地址線。.

56.成功地停用A-20的地址線;即將檢查BIOSROM數(shù)據(jù)區(qū)。鍵盤測試結(jié)束。

57.BIOSROM數(shù)據(jù)區(qū)檢查了一半;繼續(xù)進行。.

58.BIOSROM的數(shù)據(jù)區(qū)檢查結(jié)束;將清除發(fā)現(xiàn)<ESC>信息。非設(shè)置中斷測試。

59.已清除<ESC>信息;信息已顯示;即將開始DMA和中斷控制器的測試。.

5A..顯示按“F2”鍵進行設(shè)置。

5B..測試基本內(nèi)存地址。

5C..測試640K

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論