嚴斐 肖璞
摘 要: 如今上網查詢和購物已經成為人們的生活必需。由于在很多系統上查看商品或資源需要點擊跳轉多個頁面,隨著瀏覽時間的增加,經常會出現眼花繚亂的感覺。若只為用戶呈現必要的數據,必將提高篩選資源的效率。文章使用Python語言結合目前流行的Spring MVC框架來爬取目標網站的數據,設計了數據爬取模塊和數據展示模塊,實現了基于主題的爬蟲框架。通過爬取實驗與結果測試,成功爬取到了目標網站的數據并展示到自己的頁面上,實現了預期的目標。
關鍵詞: 數據爬取; 基于主題;爬蟲; SpringMVC
中圖分類號:TP311 文獻標志碼:A 文章編號:1006-8228(2018)11-10-04
Abstract: Nowadays, online enquiries and shopping have become the indispensable of people's daily life. Because viewing goods or resources on many systems requires clicking and jumping over multiple pages, it is often a dazzling feeling as browsing time increases. If only provide users with the necessary data, the efficiency of screening resources will certainly be improved. Combining with the popular Spring MVC framework, this paper uses Python language to crawl the data of the target website, designs the data crawling module and data display module, and implements the theme-based crawler framework. The crawling experiment and the test result show that, the data of the target website is crawled and displayed on its own page, and the expected goal is achieved.
Key words: data crawling; theme-based; crawler; Spring MVC
0 引言
互聯網的快速發展使得互聯網的數據變得又多又雜,人們無法在一張頁面上獲取到盡可能多的數據。因此,爬取不同網頁上的更多的數據已經成為了一種趨勢。本文的研究目的就是盡可能多的從目標網站上爬取自己想要的信息來提高獲取有用信息的效率。
隨著技術的不斷發展,各個網站的反爬蟲機制也日漸成熟,市面上所存在的一些爬蟲程序已經不能正確的爬取到用戶想要的信息。因此,一個能正確爬取數據的爬蟲項目也是市場上所需要的[1]。
本文研究的內容是如何從目標網頁上爬取自己想要的信息。目前Python作為一門易學習,易入手的編程語言受到越來越多程序員的青睞。本文選用Python作為爬取技術的編程語言,調用其中較成熟的庫如BeautifulSoup庫,Requests庫和Scrapy庫,再配合Mysql數據庫。數據展示方面配合Spring、MyBatis、Spring MVC三大框架將爬取到的數據展示到所需的頁面上。
1 爬蟲框架介紹
1.1 Scrapy庫介紹
Scrapy是一個Python著名的爬蟲框架,如圖1所示。該框架使用了Downloader抓取數據,只需要指定被抓取的url,將抓取的內容放進Item Pipeline,由客戶進行自定義的處理。Scrapy框架封裝了下載和調度等過程,方便了爬蟲的編寫。
⑴ Scrapy Engine:負責Spider,ItemPipline,Downloader,Scheduler中的通訊,信號,數據傳遞等。
⑵ Scheduler:負責接收引擎發送過來的Request請求,按照一定的順序整理,入隊再還給引擎。
⑶ Downloader:下載Scrapy Engine發送的所有的request請求并將獲取到的Responses還給Scrapy Engine,由Spider來處理。
⑷ Spiders:負責處理所有的Response請求并分析數據,提取Item需要的數據,將后繼的URL交給引擎并再次進入Scheduler。
⑸ ItemPipeline:負責處理Spider獲取到的Item,進行后期處理。
1.2 Scrapy框架的運作流程
⑴ 需要明確一個目標網站,第一個將要被處理的URL將會由Spider發送給引擎(Scrapy Engine)。
⑵ 引擎(Scrapy Engine)將會通知調度器(Scheduler)將一些request請求入隊。調度器(Scheduler)處理好之后再還給引擎(Scrapy Engine)。
⑶ 引擎(Scrapy Engine)將通知下載器(Downloader)下載request請求中需要的信息。如果下載失敗,引擎(Scrapy Engine)將會通知調度器記錄,等全部完成后再次下載。
⑷ 下載完的內容將返回給Spider由用戶自定義處理。此時,Spider會獲取以下信息:一是需要跟進的URL,二是獲取到的Item數據。
⑸ 引擎(Scrapy Engine)通知管道(Item Pipeline)處理獲取到的Item數據。同時還要通知調度器(Scheduler)跟進URL。
最后循環工作,直到獲取完所有需要的數據結束工作。
1.3 BeautifulSoup庫與Requests庫
BeautifulSoup庫與Requests庫作為Python爬蟲最常用的兩個庫現已被開發者廣泛使用。BeautifulSoup庫是一中靈活方便的解析庫,它處理高效并且支持許多的解析器。我們只需導入該庫,直接調用其中的函數就可以找到所需要的信息。對于一些前端頁面代碼較為復雜的網站,BeautifulSoup庫可以很大程度地減少程序員編寫代碼的時間。
Requests是一個很實用的HTTP客戶端庫,編寫爬蟲類的項目基本都會使用到它。它具有一些很好的特性:第一,給目標URL后添加參數時不需要手動構造新的URL,方便且避免了許多低級錯誤。第二,Requests庫中的session函數可以自動保存cookies,設置請求參數,下次請求時可以自動帶上請求的參數。第三,Requests庫支持流式上傳,支持上傳較大的文件或者數據而無需先把它們放進內存中。
2 目標網站爬蟲設計
2.1 目標網站的確定與進入
目前現有的爬蟲能帶給我們很多的開發經驗與注意事項[2-6]。本次研究選取的目標網站是對爬蟲比較友好的豆瓣網,主題是爬取豆瓣網上讀書標簽下的圖書并且按照該圖書的評分依次存儲下來。
首先,我們使用火狐瀏覽器打開豆瓣網,任選一個關于主題的圖書頁面點擊進入。嘗試更換主題,我們發現豆瓣網的URL是有規律的。如圖2和圖3所示。
基本確定URL的改變規律為:tag后面為所需要的主題,主題后面緊跟著類型資源,如果是book就顯示圖書,如果是source就是顯示的各種資源。
其次,可以發現豆瓣網站圖書頁面是分頁的并且每個頁面只展示15個資源。點擊第二頁,發現頁面的URL發生了如下變化,具體變化如圖4和圖5所示。
至此,本文基本確定了頁面URL的變化規律,首次進入頁面時由于是第一頁所以start參數為0,不顯示。第二頁開始start每次增加15代表每頁只展示15個資源。
2.2 信息匹配與檢索
確定了目標網站的URL變化模式,下一步分析我們需要爬取內容在網站中的位置。現在的目標信息為:書名,評分,評價人數,作者與出版社。需要用火狐瀏覽器打開豆瓣頁面,找到目標網站,按下F12,然后分析頁面的源代碼,找到目標信息的CSS代碼。本次假設查找的目標為關于南京的圖書,根據火狐瀏覽器所提供的信息,圖書信息對應的CSS關鍵代碼如圖6所示。
根據頁面的源代碼得知:書單的所有信息都寫在了class為mod book-list的div中。其中每個dl標簽都是一本關于主題書的信息。需要的信息除了評價人數以外,其他都寫在dd標簽中。評價人數的信息在另外的頁面,也就是書名所在標簽的超鏈接。按照同樣的方法進行代碼的定位。
2.3 狀態碼的檢測
由于在測試爬蟲時需要不斷的構造URL來進行請求,所以需要對每次請求后的狀態碼進行一個監測[8]。當進行爬取時有時候會遇到被該網站封IP的情況,此時返回的reponse的狀態碼為403,但是Scrapy框架會將該情況忽視掉,因為Scrapy庫默認是對狀態碼處于200-300之間的請求處理。因此,我們需要手動添加代碼:handle_httpstatus_list=[403],這樣就能通過判斷response.status==403來拋出CloseSpider異常,最后結束抓取。
2.4 錄入與展示
本次數據庫選用的是Mysql數據庫,需要PyMySQL驅動連接操作數據庫。讀取展示模塊就是將數據庫中存儲的信息值展示在自己的頁面上。本文選擇用Java中的Spring,SpringMvc,MyBatis三大框架搭建查詢頁面。查詢效果圖如圖7所示。
3 編寫爬蟲時遇到的問題
3.1 爬蟲被封禁
在第一次運行爬蟲爬取了幾百條數據后,開始大量的出現不正常的狀態碼,如404。再當人為打開豆瓣時,發現網站已經發現了我們的異常行為,并強制要求登錄,登錄以后才顯示正常的頁面[9]。這種情況說明所爬取的目標網站已經檢測到了我們的爬蟲,也就是我們的瀏覽特性與正常用戶不一樣,導致服務器將我們當前的IP進行封禁。
對此的解決方案就是采用User Agent偽裝對目標網站進行爬取,并加入隨機延時來更好的模擬訪問瀏覽器行為。
3.2 多主題爬取
由于此次爬取只選擇了一個主題的書進行存儲,所以單表設計沒有問題。當對多個主題的書進行爬取時,單表不利于爬取信息的瀏覽。所以在對多個主題的書進行爬取時,可以將其存放至Excel表格中,每個單元格對應的是一跳爬取數據。每個sheet頁則存放對應主題爬取到的書的信息。
根據評分從高到低依次排序展示,使得我們能更有效的瀏覽所需信息。對應的展示效果圖如圖8所示。
3.3 加密的傳參
本次選擇爬取的頁面是豆瓣網。豆瓣網內大多數頁面都是靜態的,相對來說比較容易爬取。有時需要的信息必須通過請求獲取,比如使用Ajax傳值或者使用JavaScript生成。所以我們需要使用火狐自帶的開發者工具,查看請求中的參數,然后使用程序進行模擬。當然,有些網站的傳參是加密過的,無法模擬構造需要的參數請求。遇到這樣的網站,需要改變技術,采用selenium+phantomJS框架,使用phantomJS來執行js模擬人為的操作,觸發頁面的JavaScript腳本。從填寫表單數據到表單數據提交,再到回滾頁面,這些都可以模擬出來。利用這套框架,就可以解決大多數的反爬蟲策略[7]。
4 結束語
本文研究的是Python框架下基于主題的數據爬取技術研究與實現,通過爬蟲程序的實現,對目標網站目標數據進行爬取,深入了解了Python開發的一系列步驟。從編寫完程序爬取數據時IP被網站封禁,到一步步優化程序成功爬取信息保存到本地,實現了本次論文的研究目標。
雖然本次爬蟲程序的開發工作結束,但還有很多地方需要改進。比如,當數據量過大,爬蟲爬取耗費的時間會比較耗時,可以嘗試改進成分布式的爬蟲,這樣可以提升工作效率。
參考文獻(References):
[1] 管華.對當今Python快速發展的研究與展望[J].信息系統工程,2015.12.
[2] 姜杉彪,黃凱林,盧昱江,張俊杰,曾志高,劉強.基于Python的專業網絡爬蟲的設計與實現[J].企業科技與發展,2016.8.
[3] 孫立偉,何國輝,吳禮發.網絡爬蟲技術的研究[J].電腦知識與技術,2010.15.
[4] 成功,李小正,趙全軍.一種網絡爬蟲系統中URL去重方法的研究[J].中國新技術新產品,2014.12.
[5] 牛率仁.簡析主題網絡爬蟲搜索策略[J].電腦迷,2016.10.
[6] 陳琳,任芳.基于Python的新浪微博數據爬蟲程序設計[J].計算機技術與展,2007.3.
[7] 劉艷平,俞海英,戎沁.Python模擬登錄網站并抓取網頁的方法[J].微型電腦應用,2015.2.