孫澤龍
(西安職業技術學院,陜西西安,710077)
由于現在絕大多數圖書網站都是基于一定的模板開發的,使用相關的模板,可以快速完成相同版式且不同內容的大量頁面,通過這個規律只要把相同的內容都獲取下來,求同存異地獲取實現大量頁面的目的[1]。
Python實現網絡爬蟲需要手動安裝第三方庫。Python爬蟲需要HTTP請求,它可以理解為是從客戶端到服務器端的請求消息。即就是說,無論是真正的一個人在操作瀏覽器還是一個爬蟲,當希望從服務器請求信息或服務時,首先就需要向服務器端發出一個請求,進而服務器會返回相應響應,最后連接關閉,Web服務的流程就是這樣完成的。本文用到的庫函數包含requests庫,使用requests庫調用get()和set()兩種提交方法獲取圖書網站源碼,如果網址需要提交的內容是JSON格式,要進行調用修改post()方法的一些參數。編碼格式用很多種,通過相關圖書網站編碼的測試,大多數情況下使用”utf-8”可以進行中文正常顯示。單網絡爬蟲是只有一個線程和進程,每次爬取訪問一個頁面,為了提高爬取效率和充分使用計算機網絡帶寬,一次同時讓爬蟲訪問多個頁面的目的,將使用多進程技術,通過調用multiprocessing多進程庫,處理多進程的相關操作。因為爬蟲屬于讀寫操作密集型的事情,當我們訪問請求網頁相關源碼時,多線程省去了大量等待返回網頁的時間[2]。當然,對于訪問數量達到一定數量級時,多線程需要通過異步操作來保持自身爬蟲運行的效率。
查看圖書網的網頁源碼后可以看出,它是一種結構化的數據,通過分析網頁結構信息,Python的第三方庫BeautifulSoup4,可以用來提取HTML和XML頁面結構內容,一般需要處理解析源代碼從而生成BeautifulSoup對象,找到包含特殊屬性的標簽,使用find()方法完成查找內容。Python對文本文件操作中,可以導入CSV模塊完成對CSV文件的讀取,而且CSV文件用Excel應用打開時可讀性高[3]。
解析器重要的功能是完成過濾選取網絡信息的作用。選取解析器的優劣直接決定了網絡爬蟲的執行速度和效率。Beautiful Soup不僅支持Python標準庫中的HTML解析器外,還支持一些第三方如lxml HTML、lxml XML、html5lib的解析器。Beautiful Soup的解析器對比如表1所示,列出了其目前主要的解析器,以及它們各自的優缺點。

表1 BeautifulSoup解析器對比
本文以圖書網為案例來說明,爬取目標內容為圖書的名稱、價格及對應圖書預覽圖的鏈接,爬取目標網站鏈接:http://tuan.bookschina.com/。獲取圖書網頁面信息要用到相關的類庫,打開網站看到的頁面信息是動態加載的。嘗試考慮先抓取圖書信息的第一頁開始,我使用的是chrome瀏覽器,并設置開發模式,可以查看相關頁面的相應加載信息,我們需要通過查看header信息,完成實現模擬登陸實現的功能。
對爬取圖書網目標的定義和描述。在聚焦圖書網絡爬蟲中,首先我們要依據爬取圖書網需求定義,并聚焦圖書網絡爬蟲的爬取目標,以及進行對應相關的描述。獲取初始的URL。根據初始的URL爬取頁面,并獲得新的URL。從新的URL中過濾掉與爬取目標無關的鏈接。因為聚焦網絡爬蟲對網頁的爬取是有目的性的,所以與目標無關的網頁將會被過濾掉。同時,也需要將已爬取的URL地址存放到一個URL列表中,用于去重和判斷爬取的進程。將過濾后的鏈接放到URL隊列中。從URL隊列中,根據搜索算法,確定URL的優先級,并確定下一步要爬取的URL地址。網絡爬蟲的實現原理以及相應的工作原理如圖1所示。

圖1 圖書網爬蟲運行原理
在通用網絡爬蟲中,下一步爬取哪些URL地址,是不太重要的,但是在聚焦網絡爬蟲中,由于其具有目的性,故而下一步爬取哪些URL地址相對來說是比較重要的。對于聚焦網絡爬蟲來說,不同的爬取順序,可能導致爬蟲的執行效率不同,所以,我們需要依據搜索策略來確定下一步需要爬取哪些URL地址。從下一步要爬取的URL地址中,讀取新的URL,然后依據新的URL地址爬取網頁,并重復上述爬取過程。滿足系統中設置的停止條件時,或無法獲取新的URL地址時,停止爬行。
通過分析分析整個圖書網的DOM,可以查看所需要的信息都封裝在哪些tags的里面,經過遍歷搜索后,發現到所需要的信息其實都封裝在
可以通過調用requests里get方法,獲得到了響應的response,然后通過BS進行解析,在class 名為taoListInner的div標簽中,封裝了我們需要的ul下的li,查看了beautifulsoup調用select方法拿到對應的標簽,然后拿到對應h2標簽下的書名[4]。salePrice class下的價格;以及img標簽內src的預覽圖鏈接。這樣就可以得到出我們需要的第一頁所顯示的書籍的信息了。要想獲取頁面的更多書籍信息,由于bs的select方法是只能解析靜態的Dom的,因此更多的圖書數據是通過Ajax或者JS加載的,查看開發者模式的XHR里面的內容后發現,當下拉滾動條并得到最新圖書信息的時候,會繼續刷新出一個對應的鏈接,打開并查看Preview里面,封裝了我們需要的數據,并且是以Json形式進行保存的,這樣便能使我們方便地拿到動態生成的圖書數據了。想要拿到我們需要的Json數據,首先需要去獲得相應的Request URL。
當每次有新的書籍信息刷新一次的時候,生成的GroupList?...URL中的Page=?跟隨著也會不斷遞增,因此需要去通過遍歷URL并拿到返回的JSON進行解析,這樣就可以得到我們想要的所有數據了,當遇到許多動態加載的網站,都會把以Json數據封裝作為response,爬蟲通過調用loads()方法,把返回的json數據轉換為python的字典,方便拿數據拿到數據后我們決定把數據存入磁盤,生成cvs的excel文件,寫入到相關的文件中,為了讓獲得的信息做進一步的數據分析。
要實現整個過程中并發訪問程序,需要編寫并發訪問程序實現多線程同步。通過爬蟲程序會先去獲得網站的url,然后對url內的json數據進行處理,之后寫入文件,所以在整個過程中,我們可以分別讓多個進程去獲得url中response的數據,然后進行分批地處理,寫入文件中,在python中,每個進程都有一個互斥鎖,可以保證同一時間內只能有一個線程運行,通過找到遍歷url的方法,然后把方法體進一步地封裝到scraping_page_data()方法里,并創建線程池。
進行調用join方法后,子進程會在主進程結束后不再繼續執行。主進程會去等待其他的進程,在進程池中使用apply方法去實現每個子進程,要執行apply(method_name, (parameters....))的方法。由于我們想要確保每次獲得一條url,當前進程寫入的數據的時候,不被其他進程打擾,使用給寫入操作加上進程鎖后,在寫的過程中可以知道,如果按照創建一條進程的方法也創建進程鎖,會報錯,原因是用了進程池,而進程池中的進程并不是由當前同一個父進程創建的原因[5]。multiprocessing.Manager()返回的manager對象控制了一個server進程,可用于多進程之間的安全通信。
Python擁有很強大的關于科學計算庫,如Numpy庫在數值計算領域中可以用來存儲和處理大型矩陣,矩陣運算、矢量處理、精密運算等數值編程。SymPy庫用于數學符號的計算庫,如數學中常用的自然數E、圓周率pi、虛數i等進行數學公式的符號演算推導及證明。Matplotlib庫可以把基于科學的數據可視化展示,生成如曲線、直方圖、2D、3D等根據需要的各種圖形,它是Python面向對象著名的繪圖庫,提供了許多方便調用的API命令。
Python擴充程序庫中Matplotlib庫可以完成2D繪圖庫,這使得通過編程可以形象直觀完成圖形圖表的繪制,使用Matplotlib類庫對于數據圖形化處理生成柱狀圖,通過執行寫入操作獲得數據后,需要讀取cvs中的price,分析價格低于100元的圖書的價位分布,可以引入matplotlib包來生成統計圖如圖2所示。

圖2 圖書價位統計圖
伴隨著互聯網技術的不斷發展,大量的公共信息更容易獲得,使用爬蟲技術將作為獲取這些信息的載體工具。面對第四次工業革命的發展,人工智能與物聯網將引領IT技術走向新的應用,Python網絡爬蟲作為科技浪潮領域數據應用的技術。大數據時代對數據分析與數據挖掘有著廣泛需求,利用Pyhton爬蟲使用的第三方庫函數就能實現數值分析的應用優勢,因此越來越多的程序員和科研人員也開始使用Pyhton爬蟲技術完成輔助數據分析工作,日常生活中人們使用智能手機和各種智能設備每天都會產生海量的數據,相信不遠的未來,隨著物聯網的普及,大量的智能終端設備產生的數據一定會成幾何級數的增長,因為面臨數據采集的規模將是空前的。今后很好的處理這些數據,可以為各種公司篩選需要發送定制服務的精準客戶。高職院校軟件相關專業也涉及相關課程內容,幫助學生探索培養人工智能時代的編程思維。
本文是基于python爬蟲技術實現圖書網相關數據爬取,圖書價格可視化的應用。使用第三方庫實現圖書頁面信息獲取,并利用統計分析方法庫函數,進行了提取圖書信息價格的柱狀圖繪制,這個數據的可視化展示利用分析過程的展示,今后教學實踐將繼續以Python網絡爬蟲為載體,“新工科”建設為指導,設計和挖掘更多基于Pyhton網絡爬蟲的應用案例,提升教育教學水平和激發學生學習興趣。