1. 程式人生 > 其它 >竟然如此簡單!輸入明星名字就可以直接爬取高清圖片

竟然如此簡單!輸入明星名字就可以直接爬取高清圖片

聽說你在自己喜歡的明星桌布?比如李易峰,王一博,易烊千璽、王源、王俊凱,李現等。今天教你批量下載這些明星高清桌布****(文末有福利)

最近圖慌,閒來無事爬取李易峰的高清圖片,當做手機桌布也是不錯的選擇。
廢話不多說,下面上效果圖:

是不是很帥氣呢?

爬取的步驟也非常簡單:

1、獲取目標網址。
2、瀏覽器抓包,得到圖片的具體url。
3、通過Python編寫程式碼,用requests模組對url發起請求,將圖片下載到本地資料夾中。

本文是通過面向物件的方法,程式碼更加穩定,想要多少張圖片就能下載多少張圖片。

1、分析目標網站

首先,要想爬取圖片,第一步肯定是要分析目標網址,以此來獲取圖片的 url。開啟瀏覽器的控制檯,對該網頁進行抓包,發現該網頁上的圖片是通過瀑布流的方式加載出來的,於是在往下滑,得到的下方箭頭指向的網址,那這個是否就是我們需要的呢。

為了證實該網址裡面有我們需要的資料,開啟preview,發現這些這是我們需要的,資料通過json的格式給我們呈現出來。

抓包得到我們需要的網址,接下來就簡單多了,通過requests模組向該網址發起請求,那不完事了嗎。

2、編寫程式碼

說幹就幹,首先匯入我們需要的模組

import requests
import time
import random
from urllib.request import urlretrieve
import os

下面就開始敲程式碼,通過面向物件的方式,先將具體的框架寫下來

class Wangyibo(object):
    def __init__(self,name):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
        }
        self.name = name
 
 
if __name__ == "__main__":
    #明星圖片
    name="李易峰"
    Wangyibo(name).run()

為了不被網站發現我們是網路爬蟲而不是瀏覽器,因此要加入請求頭。

def __init__(self):
  self.headers = {
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
  }

下面步入正軌,對網址傳送請求,先暫時爬取九頁

def run(self):
        for i in range(0, 200, 24):
            url = 'https://www.duitang.com/napi/blog/list/by_search/?kw='+self.name+'&type=feed&include_fields=top_comments%2Cis_root%2Csource_link%2Citem%2Cbuyable%2Croot_id%2Cstatus%2Clike_count%2Clike_id%2Csender%2Calbum%2Creply_count%2Cfavorite_blog_id&_type=&start={}'.format(
                i)
            self.request(url)

下面對該網址發起請求,將圖片下載到本地

def download_pic(self, href):
        # 判斷當前目錄下是否存在該資料夾,如果沒有就建立
        if not os.path.exists(self.name):
            os.mkdir(self.name)
 
 
        name = os.path.split(href)[1]
        urlretrieve(href, './'+self.name+'/{}'.format(name))
        print("=================={}下載完成===================".format(name))
        time.sleep(random.random())
    def request(self, url):
        response = requests.get(url, headers=self.headers)
        time.sleep(random.uniform(0, 1))
        lists = response.json()['data']['object_list']
        for list in lists:
            pic_url = list['photo']['path']
            self.download_pic(pic_url)  # pic_url即為圖片的網址

為了防止爬取太快,可能會被封IP,因此每爬取一張圖片都休息一定的時間,保證爬蟲的安全、穩定性。最後執行整體的程式,過不了多久,王一博的帥照全部都被下載到本地啦。

3、結語

1、為了大家方便學習,我把本文的完整原始碼上傳,需要的通過同名公眾領取:明星桌布

2、整個程式的程式碼相對來說還是非常簡單的,感興趣的小夥伴們都可以自己試一下。

if __name__ == "__main__":
    #明星圖片
    name="李易峰"
    Wangyibo(name).run()

3、在這裡改為自己喜歡的明星名字就可以了,他/她的高清桌布非你莫屬。