09Python爬蟲---爬蟲實戰之京東圖片

目的:獲取京東手機頁面的圖片
1、打開京東首頁(www.jd.com),選擇對應的”手機/運營商/數碼”分類,並進入“手機”子分類
1

2
鏈接地址:https://list.jd.com/list.html?cat=9987,653,655&page=1
分析網頁源碼:找到對應的圖片代碼段:
這裏寫圖片描述

思路:

1、爬取網頁
2、然後根據正則爬取出 關鍵內容
3、根據關鍵內容 再用正則匹配出 圖片地址
4、存到服務器將圖片

源代碼:

import urllib.request
import re
import urllib.error
def craw(url, page):
    html1 = urllib.request.urlopen(url).read()
    html1 = str(html1)  # 如果不轉爲str 則會報TypeError: cannot use a string pattern on a bytes-like object
    # 先把所有圖片部分的數據全部取出
    pat1 = '<div id="plist".+?<div class="clr"'  # 注意單雙引號  
    result1 = re.compile(pat1).findall(html1)
    if result1:
        result1 = result1[0]
        # 京東圖片加載時首先加載8張,然後的圖片爲懶加載所以要獲取兩次圖片
        # 根據源碼寫出對應圖片鏈接地址的正則表達式
        pat2 = '<img width="220" height="220" data-img="1" src="//(.+?\.jpg)"' 
        pat3 = '<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)"'  # 懶加載圖片正則
        imagelist = re.compile(pat2).findall(result1) # 常加載的圖片
        imagelist1 = re.compile(pat3).findall(result1)  # 懶加載的圖片
        imagelist = imagelist + imagelist1  # 數組合並 將所有圖片合併
        x = 1
        for imageurl in imagelist:
            # 對所存的圖片進行命名
            imagename = "/home/zyb/crawler/myweb/part6/img1/"+str(page)+str(x)+".jpg" 
            # 圖片地址
            imageurl = "http://"+imageurl
            try:
                # 獲取圖片並保存
                urllib.request.urlretrieve(imageurl, filename=imagename)
            except urllib.error.URLError as e:
                if hasattr(e, "code"):  # 使用hasattr函數判斷是否有這些屬性
                    x += 1
                if hasattr(e, "reason"):
                    x += 1
            x += 1
        print("爬取成功")
    else:
        print("爬取失敗,未獲取內容")
for i in range(1, 2):
    url = "https://list.jd.com/list.html?cat=9987,653,655&page="+str(i)
    craw(url, i)

最終結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章