云洋
摘要
互聯(lián)網(wǎng)中包含大量有價值的數(shù)據(jù),網(wǎng)絡爬蟲通過既定規(guī)則可以自動地抓取互聯(lián)網(wǎng)數(shù)據(jù)并下載至本地存儲。研究網(wǎng)絡爬蟲的工作原理和基于Python網(wǎng)絡信息爬取技術模塊功能,基于Requests-BeautifulSoup技術構建圖片爬蟲實現(xiàn)網(wǎng)頁圖片爬取,詳細闡述了百度貼吧美圖吧圖片爬蟲程序的采集、解析、爬取和存儲過程,實驗結果證明基于即thon的Requests-BeautifulSoup技術可快速構建圖片爬蟲程序?qū)崿F(xiàn)對網(wǎng)頁圖片數(shù)據(jù)的自動解析和爬取,程序簡單有效并且數(shù)據(jù)采集速度快。
【關鍵詞】Python語言 網(wǎng)絡爬蟲 Request-BeautifulSoup 圖片爬取
網(wǎng)絡爬蟲(Web Crawler)又稱網(wǎng)絡蜘蛛(Web Spider)是一個能夠根據(jù)既定規(guī)則自動提取網(wǎng)頁信息的程序,它模仿瀏覽器發(fā)出HTTP請求訪問網(wǎng)絡資源,自動獲取用戶需要的網(wǎng)頁數(shù)據(jù)。已有一些定向網(wǎng)站的網(wǎng)絡爬蟲,如QQ空間爬蟲一天可抓取400萬條日志、說說、個人信息等數(shù)據(jù);知乎爬蟲爬取各種話題下的優(yōu)質(zhì)答案;淘寶商品比價定向爬蟲爬取商品、評論及銷售數(shù)據(jù)。
Python是一種面向?qū)ο?、解釋型、帶有動態(tài)語義的高級程序設計語言,其語法簡潔清晰,并具有豐富和強大的類庫,Python語言支持覆蓋信息技術各領域的10萬個函數(shù)庫,依靠開源快速開發(fā),形成了全球最大的編程社區(qū)。2017年7月IEEE發(fā)布的編程語言排行榜中Python高居首位,基于Python的應用也在計算機各領域大放異彩。Python包含優(yōu)秀的網(wǎng)絡爬蟲框架和解析技術,Python語言簡單易用且提供了與爬蟲相關的urllib、requests、BeautifulSoup、Scrapy等模塊。urllib模塊提供了從萬維網(wǎng)中獲取數(shù)據(jù)的高層接口,Requests模擬瀏覽器自動發(fā)送HTTP/HTTPS請求并從互聯(lián)網(wǎng)獲取數(shù)據(jù),BeautifulSoup解析HTML/XML頁面獲取用戶需要的數(shù)據(jù)。本文基于Python的Requests-BeautifulSoup技術構建圖片爬蟲程序?qū)崿F(xiàn)對百度貼吧美圖圖片的快速爬取,并將這些圖片保存在本地,方便用戶離線瀏覽和進一步使用。
1 網(wǎng)絡爬蟲工作原理與Python爬蟲技術模塊功能
網(wǎng)絡爬蟲是按照一定規(guī)則能自動抓取互聯(lián)網(wǎng)數(shù)據(jù)的程序或者腳本。網(wǎng)絡爬蟲通過網(wǎng)絡請求從Web網(wǎng)站首頁或指定頁面開始解析網(wǎng)頁獲取所需內(nèi)容,并通過網(wǎng)頁中的鏈接地址不斷進入到下一個網(wǎng)頁,直到遍歷完這個網(wǎng)站所有的網(wǎng)頁或滿足爬蟲設定的停止條件為止。Python語言第三方網(wǎng)絡請求庫Requests模擬瀏覽器自動發(fā)送HTTP/HTTPS請求并從互聯(lián)網(wǎng)獲取數(shù)據(jù)。BeautifulSoup解析獲取的HTML/XML頁面為用戶抓取需要的數(shù)據(jù),Beautiful Soup自動將輸入文檔轉(zhuǎn)換為Unicode編碼,將輸出文檔轉(zhuǎn)換為utf-8編碼,從而節(jié)省編程時間。
1.1 網(wǎng)絡爬蟲的工作原理
網(wǎng)絡爬蟲爬取頁面就是模擬使用瀏覽器獲取頁面信息的過程,其爬取流程一般包含如下4個步驟:
(1)模擬瀏覽器發(fā)起請求:通過目標URL向服務器發(fā)起request請求,請求頭header一般包含請求類型、cookie信息以及瀏覽器類型信息等;
(2)獲取服務器頁面響應:在服務器正常響應的情況下,用戶會收到所請求網(wǎng)頁的response,一般包含HTML、Json字符串或其他二進制格式數(shù)據(jù)(如視頻,圖片)等;
(3)獲取頁面內(nèi)容解析:用相應的解析器或轉(zhuǎn)換方法處理獲取的網(wǎng)頁內(nèi)容,如用網(wǎng)頁解析器解析HTML代碼,如果是二進制數(shù)據(jù)(如視頻、圖片),則保存到文件進一步待處理;
(4)存儲數(shù)據(jù):網(wǎng)頁解析獲取的數(shù)據(jù)可以用CSV、Json、text、圖片等文件存儲,也可以sqlite、MySQL或者MongoDB等數(shù)據(jù)庫存儲。
1.2 Python第三方庫Requests模塊
Requests是用Python語言編寫,使用Apache2 Licensed許可證的HTTP庫。Python標準庫中自帶的urllib2模塊和httplib模塊提供了所需要的大多數(shù)HTTP功能,Requests使用URllib3模塊,支持HTTP連接保持和連接池,支持使用cookie保持會話,支持文件上傳,支持自動確定響應內(nèi)容的編碼,支持國際化的URL和POST數(shù)據(jù)自動編碼。
通過pip命令($pip install requests)安裝Requests模塊。URllib提供了一系列用于操作URL的功能,URllib的request模塊可以方便地訪問抓取URL(統(tǒng)一資源定位符)內(nèi)容,URllib.request模塊中常用的函數(shù)方法如表I所示。使用requests方法后,會返回一個response對象存儲服務器響應的內(nèi)容,如r.status_code(響應狀態(tài)碼)、r.text(字符串方式的響應體,會自動根據(jù)響應頭部的字符編碼進行解碼)、r.Json(Requests中內(nèi)置的JSON解碼器)、r.content(字節(jié)方式的響應體,會自動為你解碼gzip和deflate壓縮)等。
1.3 Python第三方庫Beautiful Soup模塊
Beautiful Soup是用Python寫的一個HTML/XML的解析器,它可以處理不規(guī)范標記并生成分析樹(parse tree),同時提供了簡單的python函數(shù)處理導航(navigating)、搜索并修改分析樹。
通過pip命令安裝($pip installbeautifulsoup4)Beautiful Soup模塊。BeautifulSoup將HTML文檔轉(zhuǎn)換成一個樹形結構,每個節(jié)點都是Python的對象,所有對象可歸納為4種,如表2所示。
2 貼吧圖片爬蟲程序設計
百度貼吧是全球最大的中文社區(qū)。貼吧是一種基于關鍵詞的主題交流社區(qū),貼吧結合搜索引擎建立一個在線的交流平臺,讓那些對同一個話題感興趣的人們聚集在一起,方便地展開交流和互相幫助。設計爬蟲程序爬取百度帖吧(http://tieba.baidu.com)內(nèi)的美圖吧圖片,運行爬蟲程序時提示用戶輸入想要爬取網(wǎng)站的url,爬蟲程序修改請求頭信息,模擬瀏覽器對貼吧內(nèi)的帖子依次使用get請求,進入帖子后根據(jù)規(guī)則找到所有圖片標簽,獲取帖子內(nèi)的圖片資源url,并將其依次下載到本地存儲,所有帖子爬取完成后按enter退出,運行中途也可以使用ctrl+c強制退出程序。
基于Python的Requests-BeautifulSoup技術構建圖片爬蟲程序,使用requests模擬瀏覽器請求網(wǎng)頁,用random生成隨機數(shù)選取模擬的瀏覽器,用BeautifulSoup支持的Python內(nèi)置標準HTML解析庫解析請求網(wǎng)頁返回的數(shù)據(jù),使用urllib.request.URLretrieve()下載圖片和各種網(wǎng)絡請求。
2.1 爬蟲準備
開發(fā)圖片爬蟲程序使用Python3.6版本,主要用到了urllib的requests模塊、BeautifulSoup模塊和random模塊,模塊是包含變量、函數(shù)或類的定義程序文件,使用模塊前通過import導入這些模塊。定義了兩個全局變量null和true并初始化,以避免當訪問網(wǎng)址url中出現(xiàn)null和true字樣時,Python會將null和true當成變量未初始化而報錯。
import urllib.request
from bs4 import BeautifulSoup
import random
global null#設置了兩個全局變量null和true并初始化
null="
global true
true-
2.2 定義圖片抓取函數(shù)
定義圖片抓取函數(shù)get_images(),使用BeautifulSoup解析獲取網(wǎng)頁,找到所有圖片標簽,從每個圖片標簽中下載圖片并重命名到本地保存,其代碼如下所示。
def get_images(info):#定義圖片抓取函數(shù)
soup=BeautifulSoup(info,'html.parser')#創(chuàng)建beautifulsoup對象soup
all_img=soup.find_all('img',class_='BDE Image')#找到所有圖片標簽
for img in all_img:#從每一個圖片標簽中下載圖片并重命名
image_name='%s.jpg'%img['src']
image_name=image_name.replace('jpg';a')
image_name=image_name+'.jpg'
image_name=image_name[-22:]
urllib.request.urlretrieve(img['src'],image_name)#下載圖片保存到本地文件image_name
print('成功抓取到圖片',img['src'])
print('抓取完成!')
2.3 模擬瀏覽器訪問網(wǎng)站
爬蟲程序模擬瀏覽器發(fā)送HTTP/HTTPS請求并從互聯(lián)網(wǎng)獲取數(shù)據(jù)。用戶代理UserAgent是Http協(xié)議的一部分,是請求頭信息的一部分。random是Python標準庫的模塊,用戶可以直接調(diào)用random的方法random.randint(a,b)生成一個指定范圍內(nèi)的整數(shù),其中參數(shù)a是下限,參數(shù)b是上限,下限必須小于上限??捎迷摵瘮?shù)生成隨機整數(shù)用于選取模擬的瀏覽器。訪問網(wǎng)站時通過用戶代理向服務器提供用戶使用的瀏覽器版本及類型,通過改寫User-Agent將Python爬蟲模擬成瀏覽器。如下代碼模擬不同瀏覽器型號并進入百度帖吧首頁。
Agent=['Mozilla/5.0(Macintosh;U;IntelMac OS X 10_6_8;en-us)AppleWebKit/534.50(KHTML,like Gecko)Version/5.1',
'Mozilla/4.0(compatible;MSIE 8.0;Windows NT6.0;Trident/4.0)',
'Mozilla/4.0(compatible;MSIE 7.0;Windows NT5.1;Maxthon 2.0)',
'Mozilla/4.0(compatible;MSIE 7.0;Windows NT5.1;The World)',
'Mozilla/5.0(Windows NT6.1;rv:2.0.1)Gecko/20100101 Firefox/4.0.1']
yemian=input('輸入要抓取的貼吧地址:')
req=urllib.request.Request(yemian)#用Request構建添加headers信息的完整URL請求
req.add_header('Host','tieba.baidu.com')#添加請求頭信息Host、Referer、User-Agent
req.add_header('Referer','http://tieba.baidu.com/')
req.add_header('User-Agent',Agent[random.randint(0,4)])#用random生成隨機數(shù)選取模擬的瀏覽器
2.4 進入帖子爬取圖片核心代碼
爬蟲主體程序核心代碼如下,通過urllib的requests和URLopen()方法模擬瀏覽器訪問網(wǎng)站獲取網(wǎng)頁數(shù)據(jù),用BeautifulSoup的findall()解析獲取的網(wǎng)頁數(shù)據(jù),進入帖子內(nèi)抓取帶有圖片標簽的圖片文件并下載保存在本地磁盤。運行圖片爬蟲程序后爬取下載的帖吧圖片存儲如圖1所示。
html=urllib.request.URLopen(req)#打開一個URL請求返回一個文件對象hunt
string=html.read()
soup=BeautifulSoup(string;'html.parser')#用Python標準庫解析請求網(wǎng)頁返回的數(shù)據(jù)
all_img=soup.find_all('li',class_='j_thread_list')#返回文檔中符合條件的所有標簽tag
for img in all img:#從圖片連接中下載圖片
a=eval(img['data-field'])
b=a['id']
URL2='http://tieba.baidu.com/p/%s'%b
req2=urllib.request.Request(URL2)
req2.add_header('Host','tieba.baidu.con')
req2.add header('Referer','http://tieba.baidu.com/')
req2.add_header('User-Agent',Agent[random.randint(0,4)])
html2=urllib.request.urlopen(req2)
info=html2.readQ
get_images(info)
print('全部抓取完成.')
input()#程序運行結束后等待用戶輸入回車鍵再退出
3 結束語
本文研究了網(wǎng)絡爬蟲的工作原理和Python構建爬蟲的相關技術模塊,討論了Python構建爬蟲的模塊urllib、BeautifulSoup和random的功能用法。以百度貼吧圖片爬蟲構建為例,從爬蟲準備、模擬瀏覽器登陸網(wǎng)站、定義圖片爬取函數(shù)、進入貼吧解析網(wǎng)頁、爬取圖片存儲等方面詳細闡述了采用Python的Requests-BeautifulSoup技術構建圖片爬蟲程序抓取百度貼吧美圖吧圖片的過程。實驗結果證明基于Python的Requests-BeautifulSoup技術可快速有效地構建圖片爬蟲程序?qū)崿F(xiàn)對網(wǎng)頁圖片數(shù)據(jù)的自動解析和爬取。
參考文獻
[1]郭麗蓉.基于Python的網(wǎng)絡爬蟲程序設計[J].電子技術與軟件工程,2017(23):248-249.
[2]賈棋然.基于Python專用型網(wǎng)絡爬蟲的設計及實現(xiàn)[J].電腦知識與技術,2017(12):47-49.
[3]劉艷平,俞海英,戎沁.Python模擬登錄網(wǎng)站并抓取網(wǎng)頁的方法[J].微型電腦應用,2015,31(01):58-60.
[4]涂輝,王峰,商慶偉.Python3編程實現(xiàn)網(wǎng)絡爬蟲[J].電腦編程技巧與維護,2017(23):21-22.
[5]周中華,張惠然,謝江.基于Python的新浪微博數(shù)據(jù)爬蟲[J].計算機應用,2014,34(11):3131-3134.