shell爬蟲批量下載豆瓣相冊(cè)圖片

不久前家里裝修,想搞個(gè)書架贴唇,看到豆瓣上有這么一個(gè)相冊(cè)收集了一些書房書架的圖片遂鹊,簡單寫了個(gè)shell全部抓回來參考涩嚣。

shell爬取豆瓣相冊(cè)中的圖片

分析該相冊(cè)首頁的源碼崇众,可以看到相冊(cè)總頁數(shù)含有關(guān)鍵字data-total-page掂僵,每一頁有18張圖片航厚,次頁到最后一頁的url顷歌,只要在首頁url后加?start=PAGENUMBER,其中PAGENUMBER18*頁碼幔睬,通過字符串拼接即得到相冊(cè)每一頁完整的url眯漩。

get_page_url(){
  num_pages=$(curl -A "${user_agent}" "${base_url}" | grep 'data-total-page' | head -n 1 | awk -F\" '{print $4}')
  for ((i=0; i<=num_pages; i++))
  do
    page_no=$(( 18 * i))
    page_url="${base_url}"?start=${page_no}
    get_img_no ${page_url}
  done
}

這里定義了一個(gè)函數(shù)get_page_url用于獲取相冊(cè)每一頁的url,并將該url傳遞給另一個(gè)函數(shù)get_img_no麻顶,這是一種shell中常用的參數(shù)傳遞方法赦抖。

需要注意,在(())中引用的變量不需要加前綴$辅肾。

函數(shù)get_img_no用于獲取相冊(cè)每一頁中目標(biāo)圖片的編號(hào)队萤,只要搜索關(guān)鍵詞photolst_photo即可。

get_img_no() {
  curl -A "${user_agent}" "$1" | grep "photolst_photo" | awk -F\/ '{print $6}' >> /tmp/img_no.txt
}

$1就是從get_page_url傳遞過來的網(wǎng)址矫钓,從該網(wǎng)址中提取圖片的編號(hào)要尔,存儲(chǔ)到文件/tmp/img_no.txt中。

通過函數(shù)get_page_url中的for循環(huán)新娜,反復(fù)調(diào)用get_img_no赵辕,就把相冊(cè)每一頁中的圖片編號(hào)全部提取出來了。

圖片的url可以通過簡單的字符串拼接得到概龄,但是該頁面所展示的圖片只是一個(gè)縮略圖还惠,為了得到原圖,需要解析“查看大圖”的鏈接私杜。

get_img() {
  while read line
  do
    if !(grep $line img_done.txt)
    then
      img_s_url="https://www.douban.com/photos/photo/""$line""/large"
      img_url=$(curl -A "${user_agent}" "$img_s_url" | grep '/large/' | awk -F\" '{print $6}')
      curl -A "${user_agent}" -O "$img_url"
      echo $line >> img_done.txt
      sleep 20
    fi
  done < /tmp/img_no.txt
  rm /tmp/img_no.txt
}

函數(shù)get_img用于解析大圖鏈接并下載圖片蚕键。while循環(huán)按行提取圖片編號(hào),拼接為圖片所在網(wǎng)頁的鏈接img_s_url衰粹,該網(wǎng)頁中的“查看大圖”含有關(guān)鍵詞/large/锣光,很容易解析出大圖鏈接img_url,下載完大圖后寄猩,將該圖編號(hào)追加到文件img_done.txt中嫉晶,也就是說img_done.txt中存儲(chǔ)了所有已下載圖片的編號(hào)。

這里的if用于確認(rèn)某一張圖片是否已經(jīng)下載過田篇,如果下載過則直接跳過替废,不再重復(fù)下載。如果每隔一段時(shí)間運(yùn)行一次該腳本泊柬,就可以保證只下載最新圖片椎镣。

豆瓣的反爬措施相對(duì)而言是比較完善的,不過只要稍微控制一下訪問頻率兽赁,爬取少量圖片還不足以觸發(fā)反爬程序状答,因此加入了一個(gè)延時(shí)sleep 20冷守。

完整的代碼如下。

#!/usr/bin/env bash

base_url='https://www.douban.com/photos/album/84338335/'
user_agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36'

touch img_done.txt

get_img() {
  while read line
  do
    if !(grep $line img_done.txt)
    then
      img_s_url="https://www.douban.com/photos/photo/""$line""/large"
      img_url=$(curl -A "${user_agent}" "$img_s_url" | grep '/large/' | awk -F\" '{print $6}')
      curl -A "${user_agent}" -O "$img_url"
      echo $line >> img_done.txt
      sleep 20
    fi
  done < /tmp/img_no.txt
  rm /tmp/img_no.txt
}

get_img_no() {
  curl -A "${user_agent}" "$1" | grep "photolst_photo" | awk -F\/ '{print $6}' >> /tmp/img_no.txt
}

get_page_url(){
  num_pages=$(curl -A "${user_agent}" "${base_url}" | grep 'data-total-page' | head -n 1 | awk -F\" '{print $4}')
  for ((i=0; i<=num_pages; i++))
  do
    page_no=$(( 18 * i))
    page_url="${base_url}"?start=${page_no}
    get_img_no ${page_url}
  done
}

get_page_url
get_img

exit 0

由于首次運(yùn)行時(shí)還沒有img_done.txt文件惊科,因此使用touch新建一個(gè)文件拍摇,如果該文件已經(jīng)存在,touch只更新文件的屬性信息馆截。

將該文件存儲(chǔ)為get_img.sh充活,通過bash -x可在終端中實(shí)時(shí)看到腳本運(yùn)行的情況:

$ bash -x get_img.sh

如果把腳本扔到crontab中定時(shí)運(yùn)行,就可以追蹤該相冊(cè)的更新情況蜡娶,并自動(dòng)下載最新圖片了混卵。(不過這個(gè)相冊(cè)貌似很久都不更新了。)

搞明白這個(gè)簡單的例子窖张,抓取豆瓣上其它類似內(nèi)容都易如反掌了幕随。

這個(gè)腳本充分體現(xiàn)了shell“糙、猛宿接、快”的特點(diǎn)赘淮,對(duì)于一次性的自用需求,簡直不能再合適了澄阳。

豆瓣上有個(gè)“害羞組”拥知,是很多python爬蟲初學(xué)者的試驗(yàn)?zāi)繕?biāo),何不試試shell呢碎赢?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末低剔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肮塞,更是在濱河造成了極大的恐慌襟齿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枕赵,死亡現(xiàn)場離奇詭異猜欺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拷窜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門开皿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篮昧,你說我怎么就攤上這事赋荆。” “怎么了窄潭?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嫉你,是天一觀的道長。 經(jīng)常有香客問我嚷辅,道長油挥,這世上最難降的妖魔是什么款熬? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任贤牛,我火速辦了婚禮殉簸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘武鲁。我一直安慰自己蝠检,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布饲梭。 她就那樣靜靜地躺著焰檩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兜叨。 梳的紋絲不亂的頭發(fā)上衩侥,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音议街,去河邊找鬼璧榄。 笑死特漩,一個(gè)胖子當(dāng)著我的面吹牛涂身,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丁鹉,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼揣钦,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼冯凹!你這毒婦竟也來了炒嘲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎魔熏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體道逗,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡献烦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年滓窍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巩那。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吏夯。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡即横,死狀恐怖噪生,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跺嗽,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站桨嫁,受9級(jí)特大地震影響植兰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜璃吧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畜挨。 院中可真熱鬧,春花似錦毡咏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箩退。三九已至佳谦,卻和暖如春钻蔑,著一層夾襖步出監(jiān)牢的瞬間啥刻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工咪笑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留可帽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓窗怒,卻偏偏與公主長得像映跟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扬虚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353