文/王予諾
(西安科技大學(xué) 陜西省西安市 710600)
在大數(shù)據(jù)時代,企業(yè)所掌握的數(shù)據(jù)數(shù)量決定了該企業(yè)的核心競爭力。人們所能接觸的數(shù)據(jù)數(shù)量決定了一個人的知識面和生活質(zhì)量,如何能有效地選取對自己有利的信息逐漸成為人們所追求的能力。網(wǎng)絡(luò)爬蟲可以用來幫助我們獲取有效的數(shù)據(jù)資源,比如:作為學(xué)生的你,是否想知道歷年高考卷題以及答案來復(fù)習(xí);作為找工作的你,是否想知道符合你理想條件的公司都有哪些,他們的標(biāo)準(zhǔn)都是什么;作為家庭婦女的你,是否想知道所有蔬菜水果的最佳搭配等。有了網(wǎng)絡(luò)爬蟲,我們可以輕松獲取到我們所需的數(shù)據(jù),而API server基于C/S模式,模擬客戶端向服務(wù)器發(fā)送請求,可以輕松獲取到海量資源數(shù)據(jù),也滿足你想擁有一個自己的API的愿望。
該系統(tǒng)分為API和爬蟲兩個重要部分。從結(jié)構(gòu)上可以分為客戶端和服務(wù)器端??蛻舳税╟url和postman,用于向服務(wù)器發(fā)送HTTP請求。服務(wù)器端包括dbmovie爬蟲部分和API服務(wù)器部分。這個系統(tǒng)主要操作過程如下:postman/curl從客戶端發(fā)送一個HTTP請求API服務(wù)器已經(jīng)部署成功,服務(wù)器通過調(diào)用crawler命令執(zhí)行爬蟲的任務(wù),通過管道將下載的代碼進(jìn)行處理,生成目標(biāo)文件,然后通過服務(wù)器返回結(jié)果,返回到客戶端和顯示一個爬蟲內(nèi)容。系統(tǒng)總體架構(gòu)如圖1所示。
在爬蟲框架搭建好的前提下,通過URL發(fā)送一個請求到服務(wù)器,使用xpath的方法提取的位置信息,在服務(wù)器運行正常的情況下,通過一個循環(huán)訪問數(shù)據(jù),用戶可以接收請求的頁面響應(yīng)和二進(jìn)制格式的數(shù)據(jù)。然后解析器將解析頁面的內(nèi)容。最后,管道會對二進(jìn)制數(shù)據(jù)進(jìn)行提取和處理,輸出需要的格式并將其保存,比如json格式,保存到本地。爬蟲的工作原理圖如圖2所示,系統(tǒng)功能架構(gòu)圖如圖3所示。
演示操作過程及結(jié)果的視頻如下:
http://www.iqiyi.com/w_19sb2b9fgh.html
3.1.1 安裝scrapy框架
Dos命令如下:(先安裝Twisted庫,否則會出錯)
3.1.2 建立項目
命令如下:
圖1:系統(tǒng)總體架構(gòu)
圖2:爬蟲工作原理圖
圖3:系統(tǒng)功能架構(gòu)圖
可以使用以下命令查看項目文件夾結(jié)構(gòu)
$ tree/f
項目文件夾結(jié)構(gòu)說明
items.py:封裝實體類來收集數(shù)據(jù)
pipelines.py:處理采集到的數(shù)據(jù)
settings. py:框架核心配置文件
spiders:爬蟲主腳本文件
3.1.3 創(chuàng)建爬蟲腳本
$ scrapy genspider dbmovie https://movie.douban.com/top250
3.1.4 反爬蟲
測試網(wǎng)站連接,此時會有403錯誤,需要設(shè)置頁眉信息
$ scrapy shell https://movie.douban.com/top250
此時,我們需要創(chuàng)建一個名為“rotate_useragent”的新代理。在豆瓣電影中實現(xiàn)自動隨機選擇。
核心代碼如下:
并對“設(shè)置”進(jìn)行更改,將rotate_useragent.py配置到框架中。
此時,可以使用shell視圖正常訪問瀏覽器(提示:200)
設(shè)置"items.py"來確定收集的數(shù)據(jù)對象。
核心代碼如下:
3.1.5 編寫"dbmovie.py"文件來分析HTML標(biāo)記以獲取數(shù)據(jù)
核心代碼如下:
3.1.6 編譯"pipelines.py"來設(shè)置控制臺輸出。
核心代碼如下:
3.1.7 運行
數(shù)據(jù)收集主要通過提取Xpath中的字段來實現(xiàn),使用路徑表達(dá)式來選擇web頁面中的節(jié)點,并通過節(jié)點的元素、屬性等來確定特定的信息內(nèi)容。
“rank”屬性的Xpath提取方法:
“name”屬性的Xpath提取方法:
很多網(wǎng)站都有反爬蟲機制,那么什么是反爬蟲機制呢?當(dāng)我們的crawler剛開始制作的時候,它們通常是簡單的,快速的,但是偽裝度很低。如果我們抓取的網(wǎng)站沒有防爬蟲機制,那么我們可以簡單的抓取大量的數(shù)據(jù),但是如果網(wǎng)站有反爬蟲機制,比如檢查報頭信息或者統(tǒng)計IP訪問頻率。一旦網(wǎng)站監(jiān)視器識別爬蟲程序,例如相同的IP地址和用戶代理總是python,網(wǎng)站將限制對您的IP的訪問。此時,我們需要破解反爬蟲機制。反爬蟲機制可以模擬不同的瀏覽器行為,以一定的頻率改變代理服務(wù)器和網(wǎng)關(guān),破解網(wǎng)站的反爬蟲檢測。
首先,我們可以通過“rotate_useragent”快速獲得用戶代理列表。實現(xiàn)自動隨機選擇,核心代碼如下:
然后擴展中間件,編寫user-agent列表,并將公共瀏覽器請求頭作為列表,部分核心代碼如下:
通過對數(shù)據(jù)的處理,最終可以將數(shù)據(jù)存儲為:json格式、Excel格式、數(shù)據(jù)庫格式。當(dāng)數(shù)據(jù)量不是很大時,Json存儲是一個很好的選擇。當(dāng)數(shù)據(jù)從一個項目傳遞進(jìn)來時,它被“json.dumps”轉(zhuǎn)換成json文件。注意,因為“json.dumps”為中文序列化默認(rèn)的ASCII編碼,需要為最終輸出指定“ensure_ascii = False”,核心代碼如下:
CSV類型是最簡單的保存類型之一。它只需要改進(jìn)CSV模塊到項目中,并調(diào)用“csv.writer”,核心代碼如下:
為了將數(shù)據(jù)保存在Mysql中,首先需要在Mysql數(shù)據(jù)庫中創(chuàng)建一個新的表“test”,然后需要將數(shù)據(jù)庫連接到python代碼中的爬蟲,主要是通過將數(shù)據(jù)庫的名稱與表的名稱匹配。使用SQL語句將抓取的結(jié)果直接存儲到數(shù)據(jù)庫中,核心代碼如下:
自動深度采集模塊主要處理網(wǎng)站的翻頁功能。如果沒有添加自動翻頁,爬蟲將只會運行一次,并且只能抓取一個頁面的內(nèi)容,這并不能保證它可以抓取排名在前250的所有信息。通過自動翻頁,可以通過xpath方法獲得下一頁的URL,然后判斷“下一頁”是否有效。如果是,將其URL拼接到前一頁,發(fā)送請求后完成所有頁面信息的抓取,核心代碼如下:
使用命令“pip install”將所需的Flask模塊導(dǎo)入到項目中,例如Flask、flask_restful、API等。該應(yīng)用程序是Flask的一個實例,它可以使用包或模塊的名字作為參數(shù),但是它通常會傳遞參數(shù)“__name__”,代碼如下:
在類中,它繼承自flask_rest。資源類,并定義來自請求的方法,如get、post。我主要定義了一個由“get”提交的請求。在這個方法中,我調(diào)用了“Popen”方法來運行爬蟲項目的指令。在“Popen”中,可以使用“cwd”參數(shù)指定shell命令應(yīng)該運行的位置,代碼如下:
如果想將爬網(wǎng)的內(nèi)容輸出到終端,只需讀取存儲文件的絕對路徑并輸出即可,代碼如下:
最后,在主函數(shù)中使用app.run(debug=True,port=9191)啟動API,代碼如下:
圖4:啟動API服務(wù)器
Api服務(wù)器搭建完成后,就可以啟動main.py來部署我自己的爬蟲請求,啟動API服務(wù)器,如圖4所示。
curl是一個文件傳輸實用程序,它使用URL語法從命令行開始工作,測試命令如下:
postman:這是一個可視化的軟件,用來模擬HTTP請求,幫助人們在后臺的單元工具。它可以自定義請求URL、請求類型[GET、POST等]、添加頭信息和HTTP主體信息等,使我們可以簡單直觀地測試HTTP請求。只需選擇“GET”請求方式,在URL地址欄中輸入“http://127.0.0.1:9191/”,再按“send”按鈕發(fā)送請求,就可以在響應(yīng)欄中得到輸出結(jié)果。
此項目基于Python語言強大的動態(tài)特性和簡單的語法,再加上其用于科學(xué)和數(shù)值計算的標(biāo)準(zhǔn)庫,使之性能優(yōu)于其他編程語言。通過網(wǎng)絡(luò)爬蟲爬取到的源數(shù)據(jù),經(jīng)過pipelines的處理,可以保存為json、csv、Mysql三種形式,此種網(wǎng)絡(luò)數(shù)據(jù)的采集提供了一種高效的數(shù)據(jù)采集方式,網(wǎng)絡(luò)爬蟲與API server的結(jié)合應(yīng)用,更是為用戶提供了一種簡單、便捷的請求爬蟲的方式,其操作方式以及界面的可視化效果都要遠(yuǎn)遠(yuǎn)優(yōu)于網(wǎng)絡(luò)爬蟲本身。