初級python爬蟲實戰(zhàn)一——爬取下廚房首頁高清圖

1. 預(yù)備工作

在花了兩天半時間研究學習了urllib池充,requests躯保,bs4,lxml等庫之后贩猎,準備開始一個簡單的實戰(zhàn)——爬取“下廚房”網(wǎng)站首頁所有的高清大圖熊户。


下廚房首頁

首先F12觀察一下這些圖片的真實地址:


F12觀察任意圖片地址

觀察到img =之后有一個鏈接地址,直接訪問該地址:

直接訪問觀察地址

顯然這是一個小圖吭服,不是我要的高清圖嚷堡。再觀察復(fù)制下來的鏈接
鏈接分析

不難發(fā)現(xiàn),以@為界艇棕,鏈接可以分為前后兩個部分蝌戒。猜想前一部分是圖片地址,后一部分則是對圖片進行壓縮的參數(shù)欠肾。試著刪除@及其之后的部分瓶颠,再訪問。果然出現(xiàn)了一張高清大圖刺桃。
高清大圖真實地址

這下子基礎(chǔ)部分基本弄清楚了粹淋,預(yù)備動作就到這里。

2. 開爬瑟慈!

終于可以開始寫我的第一只爬蟲了桃移,激動~

2.1 獲取頁面,解析結(jié)構(gòu)

首先葛碧,通過requests發(fā)起請求

import requests
from lxml import etree

# 模擬瀏覽器訪問
ua = 'Mozilla/5.0 ' \
     '(Windows NT 10.0; Win64; x64) ' \
     'AppleWebKit/537.36 (KHTML, like Gecko) ' \
     'Chrome/80.0.3987.116 Safari/537.36'
header = {'User-Agent': ua}
r = requests.get("http://www.xiachufang.com/", headers=header)
# r = requests.get("http://httpbin.org/", headers=header)

print(r.text)
et = etree.HTML(r.text)
data = et.xpath('//img/@src')
for i in range(len(data)):
    print(data[i])
print(len(data))

控制窗口的輸出信息為:


控制臺輸出信息

可見一共輸出了75個數(shù)據(jù)借杰,但是其中包含很大一部分:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAA1BMVEXo6Og4/a9sAAAADUlEQVR42gECAP3/AAAAAgABUyucMAAAAABJRU5ErkJggg

這樣的數(shù)據(jù)。顯然這不是我想要的。打印r.text觀察一下這些數(shù)據(jù)在頁面中的位置。發(fā)現(xiàn)有

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAMAAAAoyzS7AAAAA1BMVEXo6Og4/a9sAAAADUlEQVR42gECAP3/AAAAAgABUyucMAAAAABJRU5ErkJggg" 
data-src="http://i1.chuimg.com/b7933e0a29d54c53aab854f3ea65c9f3_750w_750h.jpg@2o_50sh_1pr_1l_60w_60h_1c_1e_90q_1wh" 
alt="夏夏2013" 
width="60" 
height="60">

原來這些用戶分享的圖片膘魄,真實地址在“data-src”屬性中奇唤,而非“src”屬性鲸阔。
查找所有的data-src

data = et.xpath('//img/@data-src')
for i in range(len(data)):
    # print(data[i])
    pass
print(len(data))

輸出結(jié)果為25,也就是原本鏈接地址為src的被篩選掉了,那么怎么才能保存所有的圖呢?
想到了一個比較low济蝉,但是可行的方案:

  1. 找到img標簽中不包含data-src屬性但包含src屬性中的src值
  2. 找到img標簽中包含data-src屬性的data-src
  3. 合并前兩步中得到的列表
    在代碼中體現(xiàn)為:
et = etree.HTML(r.text)
# 1. 找到img標簽中不包含data-src屬性但包含src屬性中的src值
data1 = et.xpath("http://img[not(@data-src) and @src]/@src")
# 2. 找到img標簽中包含data-src屬性的data-src
data2 = et.xpath("http://img/@data-src")
# 3. 合并前兩步中得到的列表
img_list= data1 + data2
for i in range(len(img_list)):
    print(img_list[i])
    # pass

觀察輸出結(jié)果:


不完美的結(jié)果

結(jié)果列表中存在空項。解決辦法當然是去除空項:

# 刪除空元素
while '' in img_list:
    img_list.remove('')

再觀察輸出結(jié)果:


完美的結(jié)果

完美輸出了69個圖片鏈接菠发。這一部分完成王滤!

2.2 處理img_list列表

由預(yù)備結(jié)果中的分析可知,下一步要做的是對列表中每一項進行分割滓鸠,只保留高清大圖部分雁乡,刪除后面的參數(shù)。也即糜俗,保留鏈接中@符號之前的部分蔗怠。使用urllib中的parse對鏈接進行分析墩弯。
導(dǎo)入urlparse

from urllib.parse import urlparse
for img in img_list:
    o = urlparse(img)

關(guān)于urlparse的用法,這里用一個例子說明:

 o = urlparse.urlparse("http://www.google.com/search?hl=en&q=urlparse&btnG=Google+Search")

參數(shù)
o.scheme 'http'
o.netloc 'www.google.com'
o.path '/search'
o.params ''
o.query 'hl=en&q=urlparse&btnG=Google+Search'
o.fragment ''

故可以對列表進行下面的處理:

for img in img_list:
    o = urlparse(img)
    filename = o.path[1:].split('@')[0]
    url = "%s://%s/%s" % (o.scheme, o.netloc, filename)
    print(url)
處理后的url

完美寞射!

2.3 文件操作

有了真實的url,下面要做的就是下載圖片并保存到本地了锌钮。使用文件操作桥温,首先必須導(dǎo)入python內(nèi)置的os模塊。

import os

初始化文件夾梁丘,如果不存在就創(chuàng)建一個:

# 文件操作,初始化xiachufang_image文件夾
image_dir = os.path.join(os.curdir, 'xiachufang_image')
if not os.path.isdir(image_dir):
    os.mkdir(image_dir)

2.4 最后一步

遍歷訪問處理后的url侵浸,并且以filename保存。(二進制寫入)

for img in img_list:
    o = urlparse(img)
    filename = o.path[1:].split('@')[0]
    filepath = os.path.join(image_dir, filename)
    url = "%s://%s/%s" % (o.scheme, o.netloc, filename)
    print(url)
    resp = requests.get(url)
    with open(filepath, 'wb') as f:
        # 二進制以塊寫入
        for chunk in resp.iter_content(1024):
            f.write(chunk)

基本沒有問題氛谜,但是少下載了幾個圖掏觉。再優(yōu)化一下:

for img in img_list:
    o = urlparse(img)
    filename = o.path[1:].split('@')[0]
    filepath = os.path.join(image_dir, filename)
    if not os.path.isdir(os.path.dirname(filepath)):
        os.mkdir(os.path.dirname(filepath))
    url = "%s://%s/%s" % (o.scheme, o.netloc, filename)
    print(url)
    resp = requests.get(url)
    with open(filepath, 'wb') as f:
        # 二進制以塊寫入
        for chunk in resp.iter_content(1024):
            f.write(chunk)

看看文件夾,已經(jīng)全部保存值漫,欣賞一下美食吧~


總覽

大圖1

大圖2

大圖3
大圖4

大圖5

成就感和食欲均滿滿

3. 完整代碼

貼出完整代碼

import os
from urllib.parse import urlparse
import requests
from lxml import etree

# 模擬瀏覽器訪問
ua = 'Mozilla/5.0 ' \
     '(Windows NT 10.0; Win64; x64) ' \
     'AppleWebKit/537.36 (KHTML, like Gecko) ' \
     'Chrome/80.0.3987.116 Safari/537.36'
header = {'User-Agent': ua}
r = requests.get("http://www.xiachufang.com/", headers=header)

# 開始解析
et = etree.HTML(r.text)
# 1. 找到img標簽中不包含data-src屬性但包含src屬性中的src值
data1 = et.xpath("http://img[not(@data-src) and @src]/@src")
# 2. 找到img標簽中包含data-src屬性的data-src
data2 = et.xpath("http://img/@data-src")
# 3. 合并前兩步中得到的列表
img_list = data1 + data2
# 刪除空元素
while '' in img_list:
    img_list.remove('')

# 文件操作,初始化xiachufang_image文件夾
image_dir = os.path.join(os.curdir, 'xiachufang_image')
# if not os.path.isdir(image_dir):
#     os.mkdir(image_dir)

for img in img_list:
    o = urlparse(img)
    filename = o.path[1:].split('@')[0]
    filepath = os.path.join(image_dir, filename)
    if not os.path.isdir(os.path.dirname(filepath)):
        os.mkdir(os.path.dirname(filepath))
    url = "%s://%s/%s" % (o.scheme, o.netloc, filename)
    print(url)
    resp = requests.get(url)
    with open(filepath, 'wb') as f:
        # 二進制以塊寫入
        for chunk in resp.iter_content(1024):
            f.write(chunk)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澳腹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杨何,更是在濱河造成了極大的恐慌酱塔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件危虱,死亡現(xiàn)場離奇詭異羊娃,居然都是意外死亡,警方通過查閱死者的電腦和手機埃跷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門蕊玷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弥雹,你說我怎么就攤上這事垃帅。” “怎么了缅糟?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵挺智,是天一觀的道長。 經(jīng)常有香客問我窗宦,道長赦颇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任赴涵,我火速辦了婚禮媒怯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘髓窜。我一直安慰自己扇苞,他們只是感情好欺殿,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳖敷,像睡著了一般脖苏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上定踱,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天棍潘,我揣著相機與錄音,去河邊找鬼崖媚。 笑死亦歉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的畅哑。 我是一名探鬼主播肴楷,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荠呐!你這毒婦竟也來了赛蔫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤直秆,失蹤者是張志新(化名)和其女友劉穎濒募,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圾结,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瑰剃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筝野。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌姚。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖歇竟,靈堂內(nèi)的尸體忽然破棺而出挥唠,到底是詐尸還是另有隱情,我是刑警寧澤焕议,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布宝磨,位于F島的核電站,受9級特大地震影響盅安,放射性物質(zhì)發(fā)生泄漏唤锉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一别瞭、第九天 我趴在偏房一處隱蔽的房頂上張望窿祥。 院中可真熱鬧,春花似錦蝙寨、人聲如沸晒衩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽听系。三九已至贝奇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跛锌,已是汗流浹背弃秆。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留髓帽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓脑豹,卻偏偏與公主長得像郑藏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瘩欺,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 這是MrKevin365天寫作計劃中第6天的寫作內(nèi)容必盖。 明天就是大年30了,按照中國人的傳統(tǒng)俱饿,明天意味著春節(jié)的開始...
    MrKevin閱讀 153評論 0 0
  • 20190221 星期四 霧轉(zhuǎn)晴 寶爸昨晚夜班歌粥,剛開學大寶表現(xiàn)還算積極,今早起來洗涮吃完飯等著我去送他...
    Ai哲朵花兒閱讀 216評論 0 1
  • ——鄧翼徐 最近對那刻畫風情萬種女人和四大家室興衰的《紅樓夢...
    D_eng閱讀 727評論 0 3