Python編程:15行代碼下載"石墨烯"圖片
譚編輯開(kāi)直播了!看期刊編輯如何利用數(shù)據(jù)挖掘技術(shù)提高工作效率!利用Python編寫(xiě)“爬蟲(chóng)”程序合理、合法地獲取想要的數(shù)據(jù),為科研、工作、學(xué)習(xí)提供“工欲善其事”的“利器”!今天譚編輯直播挖掘“小黃人”和“石墨烯”圖片,去看看!

1 了解爬蟲(chóng)
Python語(yǔ)言是一門(mén)強(qiáng)大的編程語(yǔ)言,它被廣泛應(yīng)用于科學(xué)計(jì)算、科學(xué)繪圖、大數(shù)據(jù)挖掘、大數(shù)據(jù)圖像化可視化、機(jī)器學(xué)習(xí)、人工智能等領(lǐng)域。
在科研工作中,除了科學(xué)計(jì)算與繪圖以外,Python語(yǔ)言可以用來(lái)編寫(xiě)小小的“網(wǎng)絡(luò)爬蟲(chóng)”程序,挖掘大數(shù)據(jù),并應(yīng)用于學(xué)習(xí)和科研。例如,可以利用Python編程自動(dòng)查閱并下載某一領(lǐng)域、某一關(guān)鍵詞的相關(guān)文獻(xiàn)(當(dāng)然可以設(shè)置搜索條件,例如搜索10分以上的期刊文獻(xiàn)),用于個(gè)人的學(xué)習(xí)和科研(滿(mǎn)足著作權(quán)法規(guī)定的“合理使用”條件)。
提到“網(wǎng)絡(luò)爬蟲(chóng)”,很多人可能認(rèn)為是一個(gè)“不光彩”的事情,因?yàn)樗赡芤趧e人的網(wǎng)站上“扒”數(shù)據(jù)。其實(shí)不然,我們所熟知的百度、谷歌等搜索引擎實(shí)質(zhì)上是高級(jí)的爬蟲(chóng)系統(tǒng)。
2 爬蟲(chóng)能為我們做什么
“網(wǎng)絡(luò)爬蟲(chóng)”通俗講是一種自動(dòng)化的機(jī)器人軟件,模擬人工瀏覽網(wǎng)頁(yè)的方式,全自動(dòng)快速獲取想要的文本信息或下載想要的文件(圖片、視頻、論文PDF等)。具體地,利用“爬蟲(chóng)”可以幫我們做以下事情:
(1)批量搜索、下載包含某些個(gè)關(guān)鍵詞的論文;
(2)調(diào)研某個(gè)行業(yè)的數(shù)據(jù),用于機(jī)器學(xué)習(xí)或理論分析;
(3)分析某支股票的長(zhǎng)期走勢(shì),以決定是否要入股;
(4)調(diào)查大量針對(duì)某個(gè)商品的評(píng)論,以決定是否要下單;
(5)分析大量針對(duì)某部電影的影評(píng),以決定是否要跟朋友去觀看。
這時(shí)候,爬蟲(chóng)便是我們快速獲取這些資源的一條有效途徑,能為決策者提供一種精準(zhǔn)的決策方案。
如果我想在決定是否陪兒子一起看《Bumblebee》電影之前,自己先編寫(xiě)一段爬蟲(chóng)程序,分析一下影評(píng)如何,再?zèng)Q定去否,我想這一定會(huì)傷害小朋友的心的!事實(shí)上,各大影評(píng)網(wǎng)站都已經(jīng)這樣做了,甚至“懂”你的喜好,推送你感興趣的電影。
你是否上癮抖音,欲罷不能?因?yàn)椋兑糇?ldquo;懂你”!
那么編寫(xiě)“爬蟲(chóng)”做數(shù)據(jù)分析有什么用?對(duì)于精準(zhǔn)推送、大數(shù)據(jù)分析是非常有用的。數(shù)據(jù)挖掘、大數(shù)據(jù)分析是機(jī)器學(xué)習(xí)、人工智能的前提基礎(chǔ)。新時(shí)代,挖掘的大數(shù)據(jù)是能夠提高生產(chǎn)力的、具有巨大增值價(jià)值的生產(chǎn)要素!在過(guò)去,不少人認(rèn)為“讀書(shū)無(wú)用”、“知識(shí)貶值”,但是在大數(shù)據(jù)和人工智能飛速發(fā)展的今天,筆者認(rèn)為大數(shù)據(jù)、人工智能可以創(chuàng)造倍增的“知識(shí)經(jīng)濟(jì)”!
3 怎樣合法利用爬蟲(chóng)
任何事情都有兩面性,都是“雙刃劍”。數(shù)據(jù)挖掘技術(shù)以及爬蟲(chóng)軟件本身不是壞的事物。關(guān)鍵在于應(yīng)用這些技術(shù)的“人”,法律意識(shí)、版權(quán)意識(shí)淡薄的使用者,很容易觸碰“紅線(xiàn)”。目前,已有不少公司或個(gè)人因此受到法律的制裁。
那么怎樣“爬取”才合法?筆者認(rèn)為應(yīng)該注意以下幾點(diǎn):
(1)政府或金融網(wǎng)站數(shù)據(jù)不能爬;
(2)網(wǎng)站申明“robots.txt”君子協(xié)定的條款內(nèi)容不要爬;
(3)著作權(quán)法中“合理使用”規(guī)定以外的相關(guān)內(nèi)容不要爬;
(4)網(wǎng)站后臺(tái)的、非公開(kāi)的、需付費(fèi)的數(shù)據(jù)不能爬;
(5)用于交易目的數(shù)據(jù)不能爬。
上述提到的“君子協(xié)定”,是以文本形式申明的條款,保存在域名根目錄下的“robots.txt”文件。下圖是百度網(wǎng)站的“君子協(xié)定”申明的內(nèi)容,告訴“機(jī)器人”爬蟲(chóng)哪些允許/不允許爬取。
https://www.baidu.com/robots.txt

君子協(xié)定是數(shù)據(jù)擁有者不希望其服務(wù)器上某些文件夾下的數(shù)據(jù)被挖掘而對(duì)公眾發(fā)布的申明,也是對(duì)侵權(quán)行為申訴的一個(gè)依據(jù)。也有不少網(wǎng)站并沒(méi)有設(shè)置robots.txt。不管怎樣,非申明的內(nèi)容在合理合法的前提下是可以爬取的。
4. Python編程實(shí)現(xiàn)圖片下載的實(shí)例
下面利用Python語(yǔ)言的第三方庫(kù)requests,采用少量的代碼即可實(shí)現(xiàn)強(qiáng)大的下載功能。在展示Python代碼之前,要感謝一下requests庫(kù)的作者:Kenneth Reitz。他是一位富有傳奇色彩的程序員大咖!想必不只是程序猿們的偶像!(ps: 本來(lái)已經(jīng)拼好了幾張百度下載的他的個(gè)人照,但再三考慮,為了不侵犯肖像權(quán),還是放棄了貼他的帥照。)
言歸正傳,下面講解爬蟲(chóng)挖掘圖片的代碼。
程序需要用到正則表達(dá)式和requests庫(kù),所以在程序開(kāi)頭引入re和requests兩個(gè)庫(kù):
import re
import requests
利用百度輸入“石墨烯”搜索圖片。認(rèn)真旁觀的兒子不讓搜索這個(gè)鬼玩意兒,說(shuō)搜索“小黃人”!好吧,我們輸入“小黃人”,搜索后瀏覽器顯示了找到的前30張圖片。點(diǎn)擊地址欄網(wǎng)址“復(fù)制此網(wǎng)址”,這個(gè)搜索結(jié)果的網(wǎng)頁(yè)網(wǎng)址就是我們爬蟲(chóng)需要發(fā)送請(qǐng)求的網(wǎng)址url,將該網(wǎng)址存入page_url。
然后設(shè)置報(bào)文headers,這個(gè)是告訴請(qǐng)求的服務(wù)器,我不是機(jī)器人,我是一個(gè)瀏覽器!headers信息可以在瀏覽器中按“F12”點(diǎn)擊“Check”或“審查元素”即可復(fù)制headers相關(guān)報(bào)文信息以及該網(wǎng)頁(yè)使用的請(qǐng)求方法(get或post)。
headers = {
'User-Agent': 'Mozilla/5.0 (windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/53.0.2785. 143 Safari/537.36'
}
利用下面的代碼將該網(wǎng)頁(yè)的html代碼存入一個(gè)變量res:
res = requests.get(page_url, headers= headers)
審查元素后發(fā)現(xiàn),圖片的url都是JS生成的,找到"thumbURL":"/……0.jpg"內(nèi)容,發(fā)現(xiàn)圖片地址都在thumbURL鍵值對(duì)中。利用正則表達(dá)式挖掘"thumbURL":"與"之間的字符串,采用(.*?)非貪婪模式匹配需要挖掘的字符串。
img_urls = re.findall(r'"thumbURL":"(.*?)"', res.text, re.S)
式中,re.S表示擴(kuò)展整個(gè)字符(包括換行符n),可以挖掘包括換行符在內(nèi)的的段落文本信息。
img_urls中存入的是該網(wǎng)頁(yè)中所有搜索圖片的網(wǎng)址url列表。采用for...in...遍歷列表,逐條讀取url。for循環(huán)體代碼如下:
for index, img_url in enumerate (img_urls):
try:
img_file_name = '小黃人-%s.%s' % (index, img_url.split(',')[-1].split('.')[1])
img_res = requests.get(img_url, headers=headers)
with open('pic/' + img_file_name, 'wb') as f:
f.write(img_res.content)
except:
continue
上述循環(huán)體中,采用try...except容錯(cuò),避免意外崩潰。采用requests.get請(qǐng)求每一張圖片的網(wǎng)址img_url,采用f.write將得到的圖片二進(jìn)制數(shù)據(jù)流img_res.content寫(xiě)入重命名的圖片文件中。img_file_name是對(duì)圖片重新命名,其中采用.split(‘,’)[-1]獲取原文件名,再利用.split('.')[1]獲取圖片文件的擴(kuò)展名(.jpg或.png)。
運(yùn)行程序,其下載圖片的過(guò)程演示動(dòng)畫(huà)如下:

爬取的“小黃人”圖片文件如下:

程序中,將圖片搜索結(jié)果網(wǎng)頁(yè)網(wǎng)址page_url字符串中的
“word=%E5%B0%8F%E9%BB%84%E4%BA%BA”
修改為“word=graphene”,將圖片重命名img_file_name變量中的“小黃人”修改為“graphene”,運(yùn)行程序,圖片下載的結(jié)果如下:

5 總結(jié)
對(duì)于文本挖掘(Text Mining)、資源下載(視頻、軟件、PDF等文件)均可以參照本文中的算法與代碼實(shí)現(xiàn)。
利用大數(shù)據(jù)思維、大數(shù)據(jù)挖掘與分析技術(shù),為學(xué)習(xí)、工作、科研甚至是產(chǎn)品營(yíng)銷(xiāo)等提供精準(zhǔn)、高效的決策方法,達(dá)到事半功倍的效果。
-
Origin(Pro):學(xué)習(xí)版的窗口限制【數(shù)據(jù)繪圖】 2020-08-07
-
如何卸載Aspen Plus并再重新安裝,這篇文章告訴你! 2020-05-29
-
CAD視口的邊框線(xiàn)看不到也選不中是怎么回事,怎么解決? 2020-06-04
-
教程 | Origin從DSC計(jì)算焓和比熱容 2020-08-31
-
CAD外部參照無(wú)法綁定怎么辦? 2020-06-03
-
CAD中如何將布局連帶視口中的內(nèi)容復(fù)制到另一張圖中? 2020-07-03
