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