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