Python《回車桌面圖片》

星海千尋發表於2020-12-26

今天我們爬取另一個桌布網站https://tu.enterdesk.com/
進入首頁後:
在這裡插入圖片描述

可以發現有很多的分類,我們直接按照分類來分別爬取。
比如點選一個分類【美女】。https://tu.enterdesk.com/meinv/
會有很多的照片條目。然後不斷往下翻的時候也是不斷在重新整理更新,經觀察network的XHR會發現,每一次的非同步請求都是一個html頁面哈。分析url如下:
在這裡插入圖片描述

https://tu.enterdesk.com/meinv/
https://tu.enterdesk.com/meinv/2.html
https://tu.enterdesk.com/meinv/3.html
https://tu.enterdesk.com/meinv/4.html
………
所以https://tu.enterdesk.com/meinv/ 也等於https://tu.enterdesk.com/meinv/1.html

接著來看看圖片,這裡肯定顯示的是縮圖。這裡的圖片條目點選進去不是組圖,而是單張圖片。
在這裡插入圖片描述

我們點選一張圖片進去後發現,高清的原圖如下:
在這裡插入圖片描述

在這裡插入圖片描述

我們看這個img的地址有點熟悉,對比下縮圖的高清圖的地址:
縮圖:
https://up.enterdesk.com/edpic_360_360/63/e5/a2/63e5a27adfd808429e89e70ad55cdbbd.jpg
高清圖:
https://up.enterdesk.com/edpic_source/63/e5/a2/63e5a27adfd808429e89e70ad55cdbbd.jpg

也就是一個目錄的區別(edpic_360_360 和 edpic_source)
也就是說可以不用點選進去,直接從縮圖的地址就可以得到高清圖的地址。

太簡單了!

完整程式碼如下:

import time
from concurrent.futures import ThreadPoolExecutor
import time
import os
import re
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import  Options

rootrurl = 'https://tu.enterdesk.com'
save_dir = 'D:/estimages/'
MAX_PAGES = 100

headers = {
    "Referer": rootrurl,
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
    'Accept-Language': 'en-US,en;q=0.8',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive'
}  ###設定請求的頭部,偽裝成瀏覽器

def saveOneImg(dir, img_url, title):
    new_headers = {
        "Referer": img_url,
        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
        'Accept-Language': 'en-US,en;q=0.8',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive'
    }  ###設定請求的頭部,偽裝成瀏覽器,實時換成新的 header 是為了防止403 http code問題,防止反盜鏈,

    try:
        img = requests.get(img_url, headers=new_headers)  # 請求圖片的實際URL
        if (str(img).find('200') > 1):
            with open(
                    '{}/{}.{}'.format(dir, title, img_url.split('.')[-1]), 'wb') as jpg:  # 請求圖片並寫進去到本地檔案
                jpg.write(img.content)
                print(img_url)
                jpg.close()
            return True
        else:
            return False
    except Exception as e:
        print('exception occurs: ' + img_url)
        print(e)
        return False

def getSubTitleName(str):
    cop = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")  # 匹配不是中文、大小寫、數字的其他字元
    string1 = cop.sub('', str)  # 將string1中匹配到的字元替換成空字元
    return string1

def processOnePage(dir, smallImgs):
    for img in smallImgs:
        src = img.get('src').replace('edpic_360_360', 'edpic_source')
        title = img.get('title')
        saveOneImg(dir, src, getSubTitleName(title))
    pass


def oneSpider(tag, url):

    if not os.path.exists(tag):
        os.makedirs(tag)

    for i in range(1, (MAX_PAGES + 1)):
        suburl = '{}{}.html'.format(url, i)
        html = BeautifulSoup(requests.get(suburl, headers=headers).text, features="html.parser")
        smallImgs = html.find('div', {'class': 'egeli_pic_m center'}).find_all('img')
        processOnePage(tag, smallImgs)
    pass


def getTagList():
    taglist = {}
    html = BeautifulSoup(requests.get(rootrurl, headers=headers).text, features="html.parser")
    a_s = html.find('div', {'class': 'list_sel_box'}).find('ul').find_all('a')[1:]
    for a in a_s:
        taglist['{}{}/'.format(save_dir, a.get_text())] = '{}{}'.format(rootrurl, a.get('href'))
    return taglist


if __name__ == '__main__':
    tagList = getTagList()
    print(tagList)

    # 給每個標籤配備一個執行緒
    with ThreadPoolExecutor(max_workers=30) as t:  # 建立一個最大容納數量為20的執行緒池
        for tag, url in tagList.items():
            t.submit(oneSpider, tag, url)

    # just for test
    # oneSpider('D:/estimages/美女/', 'https://tu.enterdesk.com/meinv/')

    # 等待所有執行緒都完成。
    while 1:
        print('-------------------')
        time.sleep(1)

效果如下:
在這裡插入圖片描述

相關文章