四川水利職業(yè)技術(shù)學(xué)院 趙文杰 古榮龍
隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展和大數(shù)據(jù)時代的到來,網(wǎng)絡(luò)數(shù)據(jù)呈爆炸式的發(fā)展,如何從海量的數(shù)據(jù)中快速高效地提取用戶感興趣的Web 信息,在大數(shù)據(jù)處理中面臨著巨大的挑戰(zhàn)。雖然目前通過搜索引擎可以滿足日?;镜男枨?,但對特定的內(nèi)容不能進(jìn)行集中處理和可視化展示。另外,手動搜索的效率低,對數(shù)據(jù)選取的時間成本較高。網(wǎng)絡(luò)爬蟲技術(shù)可以很好地解決這種問題,自行定制規(guī)則選取特定內(nèi)容,可以讓我們更精準(zhǔn)地獲取有效數(shù)據(jù)。同時網(wǎng)絡(luò)爬蟲可以根據(jù)網(wǎng)頁內(nèi)容進(jìn)行深度和廣度搜索,實現(xiàn)自動化運行[1]。
網(wǎng)絡(luò)爬蟲,是按照設(shè)定的規(guī)則自動抓取網(wǎng)絡(luò)信息的程序。網(wǎng)頁中包含了文字信息、超鏈接信息。從功能上來講,爬蟲的處理過程一般包括數(shù)據(jù)采集、處理、儲存三個部分。在網(wǎng)絡(luò)爬蟲的系統(tǒng)框架中,主過程由控制器、解析器、資源庫三部分組成??刂破鞯闹饕ぷ魇秦?fù)責(zé)給多線程中的各個爬蟲線程分配工作任務(wù)。解析器的主要工作是下載網(wǎng)頁,進(jìn)行頁面的處理,主要是將一些JS 腳本標(biāo)簽、CSS 代碼內(nèi)容、空格字符、HTML 標(biāo)簽等內(nèi)容處理掉,爬蟲的基本工作由解析器完成。資源庫用來存放下載到的網(wǎng)頁資源,一般都采用大型的數(shù)據(jù)庫存儲[2]。
網(wǎng)絡(luò)爬蟲技術(shù)分為以下幾類:通用網(wǎng)絡(luò)爬蟲、聚焦網(wǎng)絡(luò)爬蟲、增量網(wǎng)絡(luò)爬蟲、深層網(wǎng)絡(luò)爬蟲[3]。這幾種爬蟲的關(guān)鍵技術(shù)是類似的。爬蟲獲取網(wǎng)絡(luò)數(shù)據(jù)的方式:模擬瀏覽器發(fā)送請求,獲取網(wǎng)頁代碼——提取有用數(shù)據(jù),解析內(nèi)容,保存數(shù)據(jù)。
Python 是一種解釋型、面向?qū)ο?、動態(tài)數(shù)據(jù)類型的高級程序設(shè)計語言。它是解釋型語言,但是也可以編譯成.pyc 跨平臺的字節(jié)碼文件。.pyc 文件有幾個好處:一是可以簡單地隱藏源碼,二是提高載入速度,三是跨平臺。相較于C++、Java 語言,Python 更易于學(xué)習(xí),有一個廣泛的標(biāo)準(zhǔn)庫。同時可以結(jié)合Java 或C/C++語言,封裝成Python 可以調(diào)用的擴展庫,便于擴展和移植。Python 提供了非常豐富的針對網(wǎng)絡(luò)協(xié)議的標(biāo)準(zhǔn)庫,能簡單高效地進(jìn)行網(wǎng)頁抓取、網(wǎng)頁解析、數(shù)據(jù)存儲等,使程序員可以集中精力處理程序邏輯[4]。
本文通過Python 語言來實現(xiàn)一個簡單的聚焦型爬蟲,爬取當(dāng)當(dāng)網(wǎng)上的圖書信息,將圖書的封面圖片,圖書書名、圖書鏈接頁面保存在本地csv 文件中。本文在Python3.6 環(huán)境下調(diào)試完成。
該系統(tǒng)主要由三個方面構(gòu)成。第一,Url 管理器,負(fù)責(zé)提取網(wǎng)絡(luò)的url 地址。第二,網(wǎng)頁下載器,從網(wǎng)絡(luò)上下載網(wǎng)站內(nèi)容,獲取頁面中詳細(xì)信息;第三,頁面解析器,針對網(wǎng)頁下載器中的信息,提取目標(biāo)信息;第四,數(shù)據(jù)存儲器,完成數(shù)據(jù)持久化。
具體實現(xiàn)過程如下:
(1)打開當(dāng)當(dāng)網(wǎng)頁面,搜索關(guān)鍵字“Python”,結(jié)果如圖1 所示。
圖1 搜索結(jié)果圖
(2)分析源代碼,可利用開發(fā)者工具查看每個數(shù)據(jù)對應(yīng)的元素及class 名稱,如圖2 所示。
圖2 網(wǎng)頁源代碼
(3)對網(wǎng)頁進(jìn)行解析,可以使用正則表達(dá)式、BeautifulSoup、lxml 等多種方式來解析網(wǎng)頁,每種方法各有特色,使用時結(jié)合實際需要選擇一種適合的解析方法。
#導(dǎo)入程序需要的庫
import urllib.request
import time
import csv
import codecs
from bs4 import BeautifulSoup
#打開網(wǎng)頁,輸入關(guān)鍵字”python”
圖3 保存在csv 文件中的數(shù)據(jù)
#爬取地址,當(dāng)當(dāng)Python 的書籍太多,我們只爬取前20 頁的信息
url="http://search.dangdang.com/?key=python&act=input&s how=big&page_index="
#請求頭
headers={'
User-Agent':'Mozilla/5.0 (Windows NT 6.1;Win64;x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
index=1
while index<=20:
#發(fā)起請求
request = urllib.request.Request (url=url+str (index),headers=headers)
response=urllib.request.urlopen(request)
index=index+1
#通過BeautifulSoup 的find_all 方法解析頁面
soup=BeautifulSoup(response)
temps=soup.find_all('a',class_='pic')
global books
books=books+temps
(4)數(shù)據(jù)持久化,將爬取的數(shù)據(jù)保留在本地。數(shù)據(jù)存儲的方式方法有多種,可以保留在普通文件中,如txt、csv 等。也可以存儲在數(shù)據(jù)庫中,如MySQL。本文將爬取到的數(shù)據(jù)寫入csv 文件,結(jié)果如圖3 所示。代碼如下:
file_name='PythonBook.csv'
#指定編碼為utf-8,避免寫csv 文件出現(xiàn)中文亂碼
with codecs.open(file_name,'w','utf-8')as csvfile:
filednames=['書名','頁面地址','圖片地址']
writer=csv.DictWriter(csvfile,fieldnames=filednames)
writer.writeheader()
for book in books:
if len(list(book.children)[0].attrs)==3:
img=list(book.children)[0].attrs['data-original']
else:
img=list(book.children)[0].attrs['src']
try:
writer.writerow({' 書名':book.attrs['title'], ' 頁面地址':book.attrs['href'],'圖片地址':img})
except UnicodeEncodeError:
print("編碼錯誤,該數(shù)據(jù)無法寫到文件中")
本文介紹了基于Python 的網(wǎng)絡(luò)爬蟲技術(shù)的工作流程,以實際案例演示了當(dāng)當(dāng)網(wǎng)數(shù)據(jù)的爬取過程?,F(xiàn)在已經(jīng)進(jìn)入大數(shù)據(jù)時代,網(wǎng)絡(luò)爬蟲技術(shù)具有極高的實際應(yīng)用價值,作為一種自動收集數(shù)據(jù)的手段,在各行各業(yè)都有廣泛的應(yīng)用。同時也能為后續(xù)數(shù)據(jù)處理、數(shù)據(jù)分析做好準(zhǔn)備。