姜慶玲 張樊
摘 ?要:隨著“互聯(lián)網(wǎng)+”和大數(shù)據(jù)時(shí)代的到來,網(wǎng)絡(luò)上充斥著各種各樣的數(shù)據(jù),過濾并獲取有用的數(shù)據(jù)在當(dāng)今環(huán)境下至關(guān)重要。文章提出一種基于Python和Requests模塊的快速獲取網(wǎng)頁數(shù)據(jù)的方法,使用該方法可以獲取解析前的網(wǎng)頁源代碼文本和圖片數(shù)據(jù),并保存為本地文件,為之后的數(shù)據(jù)分析和深入學(xué)習(xí)大數(shù)據(jù)技術(shù)奠定基礎(chǔ)。實(shí)驗(yàn)結(jié)果表明,該方法步驟和代碼編寫簡(jiǎn)單易學(xué),運(yùn)行結(jié)果較好,具有一定的實(shí)用性。
關(guān)鍵詞:Python技術(shù);Requests模塊;網(wǎng)絡(luò)圖片爬取
中圖分類號(hào):TP312.1;TP393 ? 文獻(xiàn)標(biāo)識(shí)碼:A ? 文章編號(hào):2096-4706(2023)16-0100-05
Research on Method of Quickly Obtaining Web Data Based on Python and Requests
JIANG Qingling, ZHANG Fan
(Wuchang Institute of Technology, Wuhan ?430065, China)
Abstract: With the arrival of the “Internet+” and big data era, the network is full of all kinds of data. Filtering and obtaining useful data is crucial in today's environment. This paper proposes a method to quickly acquire web data based on Python and Requests modules. Using this method, you can obtain the text and image data of the web source code before parsing, and save them as local files, laying the foundation for later data analysis and in-depth study of big data technology. The experimental results show that the steps and coding of this method are easy to learn, the running results are good, and it has certain practicability.
Keywords: Python technology; Requests module; network image crawling
0 ?引 ?言
近年來,隨著國家“互聯(lián)網(wǎng)+”行動(dòng)的提出,各行各業(yè)都開始關(guān)注互聯(lián)網(wǎng)技術(shù)的發(fā)展,這也促進(jìn)了大數(shù)據(jù)時(shí)代的到來。在大數(shù)據(jù)時(shí)代下,文字和圖片信息也逐步數(shù)字化,出現(xiàn)在大小屏幕上,人們獲取信息的方式更加快捷和多樣。大量的數(shù)據(jù)逐步堆積在網(wǎng)絡(luò)上,人們接收的信息也逐漸龐大,而其中有些信息,人們并不需要。這時(shí),一種能過濾信息的技術(shù)就會(huì)應(yīng)運(yùn)而生,Python語言就可以很好地幫助人們過濾并獲取有用的信息。本文將介紹基于Python語言下獲取網(wǎng)頁數(shù)據(jù)的方法,該方法簡(jiǎn)單易實(shí)現(xiàn),能夠獲取網(wǎng)頁文本和圖片數(shù)據(jù)。
縱觀近5年國內(nèi)在Python技術(shù)中獲取網(wǎng)頁信息的文獻(xiàn),有大量的網(wǎng)頁爬蟲框架的研究,例如基于Scrapy爬蟲框架的研究有新浪微博數(shù)據(jù)爬蟲研究[1]、房產(chǎn)信息爬取系統(tǒng)設(shè)計(jì)[2]、分布式獲取當(dāng)當(dāng)網(wǎng)圖書數(shù)據(jù)[3]、食品安全輿論數(shù)據(jù)爬取與分析[4]、研招網(wǎng)碩士目錄爬蟲的設(shè)計(jì)與實(shí)現(xiàn)[5]等。除了Scrapy爬蟲技術(shù)的研究,還有學(xué)者對(duì)主流的爬蟲技術(shù)的研究,例如楊健[6]等學(xué)者就對(duì)基于Python技術(shù)的三種網(wǎng)絡(luò)爬蟲框架(Requests、Scrapy、Selenium)進(jìn)行了研究,分析了這三種爬蟲技術(shù)的各自優(yōu)勢(shì)和適用場(chǎng)合。根據(jù)已有的研究成果,經(jīng)過各種技術(shù)的比較驗(yàn)證后,在確保獲取信息效果正確的前提下,Requests庫代碼量和步驟都較少,簡(jiǎn)單易學(xué),適合讀者驗(yàn)證并投入使用。綜上所述,本文將使用Requests庫實(shí)現(xiàn)獲取網(wǎng)頁的文本和圖片數(shù)據(jù)。
1 ?相關(guān)技術(shù)
1.1 ?Python語言
Python由吉多·范羅蘇姆(Guido van Rossum)于20世紀(jì)90年代初設(shè)計(jì),作為一門叫作ABC語言的替代品,吉多·范羅蘇姆曾在于20世紀(jì)80年代曾在ABC系統(tǒng)開發(fā)中工作了數(shù)年,ABC語言定位為一種交互式的結(jié)構(gòu)化高級(jí)語言,旨在替代BASIC、Pascal等語言,用于教學(xué)及原型軟件設(shè)計(jì),它專注于編程初學(xué)者,但是存在平臺(tái)遷移能力弱且難以添加新功能等問題,以至于ABC語言并未成功。Python繼承了ABC語言的優(yōu)點(diǎn),能夠讓編程初學(xué)者易學(xué)上手,并解決了前者的致命性問題,確保了拓展模塊的編寫和跨平臺(tái)運(yùn)行。
Python基于上述優(yōu)點(diǎn),應(yīng)用起來非常方便,迅速流行起來,也逐步推動(dòng)了其自身的發(fā)展?,F(xiàn)在的Python語言擁有豐富的庫、面向?qū)ο?、免費(fèi)開源、可擴(kuò)展性、可嵌入性、可進(jìn)行高級(jí)動(dòng)態(tài)編碼、適合做科學(xué)計(jì)算等諸多優(yōu)點(diǎn),也促使了大數(shù)據(jù)和人工智能的發(fā)展,就連國內(nèi)高等教育中,Python語言程序設(shè)計(jì)已經(jīng)成為基礎(chǔ)學(xué)科。
在語法方面,區(qū)別于其他高級(jí)語言,Python語言必須使用4個(gè)空格來表示每級(jí)縮進(jìn),縮進(jìn)是語法的一部分。除此之外,Python語法和其他高級(jí)語言類似,例如數(shù)據(jù)類型、表達(dá)式、語句、函數(shù)、對(duì)象等語法,僅部分寫法有些差別。
Python擁有豐富的庫,可拓展性極強(qiáng),應(yīng)用領(lǐng)域非常廣泛,主要應(yīng)用于軟件開發(fā)、科學(xué)計(jì)算和統(tǒng)計(jì)、人工智能、圖像處理、數(shù)字和文本處理、數(shù)據(jù)庫編程、網(wǎng)絡(luò)編程、多媒體應(yīng)用、游戲引擎、黑客編程等多個(gè)領(lǐng)域。
1.2 ?Requests模塊
Requests模塊是Python豐富的庫文件中的一種,是一個(gè)基于Apache2協(xié)議開源的Python HTTP庫。它是爬蟲技術(shù)的基礎(chǔ),號(hào)稱是“為人類準(zhǔn)備的HTTP庫”。在Python語言中,系統(tǒng)自帶的urllib和urllib2都提供了功能強(qiáng)大的HTTP支持,但是API接口確實(shí)太難用了,這才有了Requests庫的產(chǎn)生。在Requests模塊中,請(qǐng)求一個(gè)網(wǎng)頁地址,只需要一句代碼。
使用Requests模塊的步驟如下:
1)解析網(wǎng)址URL的格式和參數(shù);
2)設(shè)置網(wǎng)絡(luò)請(qǐng)求參數(shù);
3)選擇合適的請(qǐng)求方式發(fā)送網(wǎng)絡(luò)請(qǐng)求;
4)根據(jù)網(wǎng)絡(luò)請(qǐng)求狀態(tài)碼判斷是否獲取成功,如果成功,接收并保存數(shù)據(jù);
5)根據(jù)需要解碼數(shù)據(jù)。
2 ?步驟詳解
2.1 ?解析網(wǎng)址URL
在上述步驟第一步中,網(wǎng)址URL通用格式為:
<方案>://<主機(jī)>:<端口>/<路徑>/<參數(shù)>?<查詢>#<錨點(diǎn)>
其中:
根據(jù)上述合法的網(wǎng)址格式,可舉例如下:
http://www.baidu.com/s?wd=狗
http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=楊紫
2.2 ?設(shè)置網(wǎng)絡(luò)請(qǐng)求參數(shù)
在確定好要爬取的網(wǎng)頁URL后,點(diǎn)擊頁面右鍵的“檢查”選擇項(xiàng)后,出現(xiàn)如圖1所示的界面,在該界面中,依次選擇“網(wǎng)絡(luò)”選項(xiàng)卡、“文檔”選項(xiàng)卡,點(diǎn)擊對(duì)應(yīng)網(wǎng)址后,查看標(biāo)頭里面的User Agent,這就是需要設(shè)置的網(wǎng)絡(luò)請(qǐng)求參數(shù)。
User Agent簡(jiǎn)稱UA,表示用戶代理,是軟件提供的一個(gè)標(biāo)識(shí)自己身份的標(biāo)識(shí)符,包含了用戶正在使用的設(shè)備以及軟件的一些信息,例如瀏覽器、版本、瀏覽器渲染引擎等。不同的瀏覽器其User Agent不同,因此需要在發(fā)送請(qǐng)求之前設(shè)置好該參數(shù)。
2.3 ?發(fā)送網(wǎng)絡(luò)請(qǐng)求
網(wǎng)絡(luò)請(qǐng)求主要用于資源訪問、接口數(shù)據(jù)的請(qǐng)求、傳下載文件等操作。常見的請(qǐng)求方式主要包括GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS等,其中GET和POST請(qǐng)求使用最頻繁。
2.3.1 ?GET請(qǐng)求方式
GET請(qǐng)求主要用于獲取資源,對(duì)服務(wù)器上資源不會(huì)產(chǎn)生影響,它可以把請(qǐng)求的一些參數(shù)信息拼接在URL上,傳遞給服務(wù)器,由服務(wù)器端進(jìn)行參數(shù)信息解析,然后返回相應(yīng)的資源給請(qǐng)求者。需要注意的是,GET請(qǐng)求拼接的URL數(shù)據(jù)大小和長度是有最大限制的,傳輸?shù)臄?shù)據(jù)量一般限制在2 KB。
2.3.2 ?POST請(qǐng)求方式
POST請(qǐng)求執(zhí)行提交信息、傳輸信息的操作,對(duì)服務(wù)器上資源會(huì)產(chǎn)生影響,一般用于例如注冊(cè)、登錄、上傳文件(百度云盤)等操作。POST請(qǐng)求傳遞的一些數(shù)據(jù)和參數(shù)不是直接拼接在URL后的,而是放在Http請(qǐng)求Body里。相對(duì)GET請(qǐng)求來說,POST請(qǐng)求比較安全,并且傳遞的數(shù)據(jù)大小和格式是無限制的。
本文中獲取網(wǎng)頁數(shù)據(jù)并不需要修改服務(wù)器上資源,不需要嚴(yán)格的安全性要求,且需要傳遞的數(shù)據(jù)量并不大,綜合考慮后,采用GET方式發(fā)送網(wǎng)絡(luò)請(qǐng)求。
2.4 ?判斷網(wǎng)絡(luò)請(qǐng)求狀態(tài)碼
在Requests模塊中,常見的網(wǎng)絡(luò)請(qǐng)求狀態(tài)碼如表1所示。
如果狀態(tài)碼是200,則應(yīng)該將請(qǐng)求返回的結(jié)果保存起來,使用Python中的with語句實(shí)現(xiàn):
with open('保存路徑','讀取模式') as f:
f.write(需要保存的內(nèi)容)
其中讀取模式有b(二進(jìn)制)、r(只讀),w(只寫),a(追加),如果最后有+號(hào),表示文檔可讀可寫。其中,需要注意的是,寫入一般會(huì)覆蓋原文件,追加則在原文件尾部開始寫,如果文件不存在,w,w+,a,a+,wb會(huì)創(chuàng)建新文件。
2.5 ?解碼數(shù)據(jù)
網(wǎng)頁中有些數(shù)據(jù)在返回的過程中存在加密的代碼,那么這樣就無法得到想要的數(shù)據(jù),這事就需要解碼,例如將返回的內(nèi)容存為txt文本格式,一般需要解碼為“UTF-8”的格式,這時(shí)需要使用decode("utf8")實(shí)現(xiàn)。
3 ?獲取網(wǎng)頁數(shù)據(jù)的具體實(shí)現(xiàn)
3.1 ?編程環(huán)境
本文在Window 10操作系統(tǒng)下安裝Python 3.7.4版本,集成開發(fā)環(huán)境IDE使用PyCharm Community版本,瀏覽器使用Chrome。
在PyCharm中創(chuàng)建項(xiàng)目,并安裝Requests庫,安裝成功后如圖2所示。
3.2 ?獲取網(wǎng)頁源代碼文本
以獲取百度頁面的代碼為例,其網(wǎng)址為“https://www.baidu.com”。如果想獲取其源代碼,可以發(fā)現(xiàn)右鍵查看源代碼,并不是真正的源代碼,是服務(wù)器經(jīng)過解析后返回的代碼,如圖3所示。
那么想得到真正的源代碼就必須在服務(wù)器解析之前就獲取,使用Requests庫發(fā)送請(qǐng)求就可以實(shí)現(xiàn),按照上述步驟,獲取網(wǎng)址后,設(shè)置對(duì)應(yīng)的User Agent為“Mozilla/5.0 (Windows NT 10.0; Win 64; x 64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
111.0.0.0 Safari/537.36”,編寫Python代碼如下:
import requests ? #導(dǎo)入requests庫
#1.網(wǎng)址URL
url="https://www.baidu.com"
#2.設(shè)置請(qǐng)求參數(shù)
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
}
#3.發(fā)送GET請(qǐng)求獲取頁面
res=requests.get(url,headers=headers)
#4.保存返回內(nèi)容
content=res.content.decode("utf8") ?# 應(yīng)使用二進(jìn)制bytes流,并解碼為utf-8
#5.獲取的內(nèi)容進(jìn)行存儲(chǔ)
with open('baidu.txt','w') as f:
f.write(content)
運(yùn)行程序后,會(huì)在當(dāng)前程序的同級(jí)目錄下生成一個(gè)“baidu.txt”的文本文件,內(nèi)容如圖4所示。
將上述文件另存為UTF-8格式后,修改后綴名為“html”,再打開就是一個(gè)靜態(tài)的百度頁面。
3.3 ?獲取網(wǎng)頁圖片
以獲取百度圖片中“萌寵”圖片為例,選擇器任意一張圖片并右鍵復(fù)制鏈接地址,根據(jù)選擇的圖片地址,編寫代碼如下:
import requests
url="https://img2.baidu.com/it/u=4117544783,3162221579&fm=253&fmt=auto&app=138&f=JPEG?w=281&h=499"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
}
res=requests.get(url,headers=headers)
print(res)
content=res.content ? #圖片是二進(jìn)制文件,因此不用解碼
#保存圖片文件
with open("animal.png",'wb') as f:
f.write(content)
運(yùn)行結(jié)果如圖5所示。
4 ?結(jié) ?論
本文通過Python語言結(jié)合Requests模塊實(shí)現(xiàn)了簡(jiǎn)單的網(wǎng)頁中源代碼文本和圖片數(shù)據(jù)的獲取,經(jīng)試驗(yàn)驗(yàn)證,本文使用的實(shí)現(xiàn)思路、步驟和代碼編寫均簡(jiǎn)單易學(xué),實(shí)現(xiàn)效果較好。在“互聯(lián)網(wǎng)+”和大數(shù)據(jù)時(shí)代背景下,能夠?yàn)閷W(xué)習(xí)爬蟲框架、獲取大量網(wǎng)絡(luò)數(shù)據(jù)并進(jìn)行數(shù)據(jù)分析、深入研究大數(shù)據(jù)和人工智能技術(shù)奠定數(shù)據(jù)基礎(chǔ)。
參考文獻(xiàn):
[1] 鄧曉璐,姚松.基于Scrapy的新浪微博數(shù)據(jù)爬蟲研究 [J].現(xiàn)代信息科技,2023,7(3):44-47.
[2] 曾水新,黃日勝.基于Scrapy的房產(chǎn)信息爬取系統(tǒng)設(shè)計(jì) [J].電腦編程技巧與維護(hù),2022(12):26-28.
[3] 胡學(xué)軍,李嘉誠.基于Scrapy-Redis的分布式爬取當(dāng)當(dāng)網(wǎng)圖書數(shù)據(jù) [J].軟件工程,2022,25(10):8-11.
[4] 魏海昱,林偉鴻,賀超波.基于Scrapy的食品安全輿情數(shù)據(jù)爬取與分析 [J].現(xiàn)代計(jì)算機(jī),2022,28(14):49-54+95.
[5] 伍高巍,劉杰,葛曉龍,等.基于Scrapy的研招網(wǎng)碩士目錄爬蟲的設(shè)計(jì)與實(shí)現(xiàn) [J].電腦知識(shí)與技術(shù),2022,17(18):53-55.
[6] 楊健,陳偉.基于Python的三種網(wǎng)絡(luò)爬蟲技術(shù)研究 [J].軟件工程,2023,26(2):24-27+19.
作者簡(jiǎn)介:姜慶玲(1991.05—),女,漢族,湖北孝感人,教師,碩士,研究方向:計(jì)算機(jī)基礎(chǔ)應(yīng)用,數(shù)據(jù)分析與數(shù)據(jù)挖掘。