requests+正規表示式(二) 之 百科和京東圖片 的下載

weixin_34124651發表於2018-04-29
爬取了那麼多資料資訊,今天我們換個口味,爬取圖片連結並將其下載到本地裡,下面我們來下百度百科和京東的圖片,廢話不多說,直接上案例:

案例一:爬取百度百科圖片(https://tieba.baidu.com/p/3823765471?red_tag=2142847374

開啟這個網址我們檢查下圖片和網頁原始碼,規律如下:
10590983-0b843afc9341dbc6.png
2.png
觀察了圖片格式之後,我們可以開始定義函式並設定爬取的正則了:
import requests
import re
import urllib.request

#模擬成瀏覽器
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36" }

#定義爬取貼吧圖片並下載的函式 (https://tieba.baidu.com/p/3823765471)
def req_tieba_img(url):
    html = requests.get(url, headers=headers)#請求頁面原始碼
    html.encoding = "utf-8" #設定編碼
    response = html.text #轉換成文字形式
    #爬取圖片的正規表示式
    reg = r'<img class="BDE_Image" src="(.*?\.jpg)"'
    data = re.compile(reg, re.S).findall(response) #預編譯並執行查詢

    x = 1
    for img in data:
        img_name = r"C:/Users/Administrator/Desktop/baike/"+ str(x) +".jpg"
        
        print("正在寫入第 "+ str(x) +" 張圖片...")
        try:
            with open(img_name,"wb") as f: #將圖片儲存如本地
                f.write(requests.get(img).content) #這個必須要先請求圖片而不僅僅是放入的是連結而已
        except Exception as e: #即使丟擲異常對我們的重新命名圖片也沒有影響
            x += 1
        
        x += 1 #自增

#呼叫
url = "https://tieba.baidu.com/p/3823765471"
req_tieba_img(url)

我們執行爬蟲檔案之後效果如下:

10590983-7eb5c83dacceb71a.png
3.png

案例二:爬取京東手機圖片(https://list.jd.com/list.html?cat=9987,653,655&page=頁數)

開啟網頁我們在檢查中觀察我們要抓取的圖片列表所在的區域,因為京東頁面圖片太多,因此待會兒我們爬取的時候先定位我們需要爬取的區域(注:區域定位有個開始和結束位置,並且這個兩個標誌必須唯一),然後再找個區域裡面爬取圖片,頁面觀察圖:
10590983-a833ee327bffe70d.png
5.png
知道規律之後我們開始敲程式碼了:
#定義爬取京東手機圖片並下載的函式
def req_jingdong_img(url, page):
    #請求頁面原始碼
    html = requests.get(url, headers=headers)
    html.encoding = "utf-8" #設定編碼
    response = html.text #轉換成文字形式
    #指定爬取的資料範圍及過濾掉部分沒必要的資訊
    reg1 = r'<div id="plist".+?<div class="page clearfix">' #設定正規表示式
    data1 = re.compile(reg1, re.S).findall(response) #預編譯並且執行
    #抓取jpg圖片連結
    reg2 = r'<img width="220" height="220" data-img="1" src="//(.*?\.jpg)"'
    list_img = re.compile(reg2, re.S).findall(data1[0])

    x = 1
    for imgurl in list_img:
        image_name = "C:\\Users\\Administrator\\Desktop\\jingdongimg\\"+ str(page) + str(x) +".jpg" #拼接下載之後圖片的名字
        imgurl = "http://"+ imgurl #在瀏覽器中開啟觀察位址列中的圖片連結
        
        print("正在寫入第 "+ str(page)+" 頁第 "+ str(x) +" 張圖片")

        try:
            urllib.request.urlretrieve(imgurl, filename=image_name)#這個方式自帶請求圖片

        except Exception as e:
            x += 1

        x += 1


#呼叫
for i in range(1,67):#請求66頁的圖片
    url = "https://list.jd.com/list.html?cat=9987,653,655&page="+ str(i)
    req_jingdong_img(url, i)


執行之後效果圖如下:

10590983-83d0de40e5f3fa6f.png
6.png
哈哈哈,圖片爬取和下載就是這樣了,爬取網站千變萬化,但是使用的核心技術還是一個原理,希望對您有幫助,歡迎留言!

相關文章