Python《必應bing桌面圖片爬取》

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

桌面桌布,來自於bing,必應的桌布網址。https://bing.ioliu.cn/
每一頁都有12張照片,每個照片有對應的download高清大圖的地址,有多個分頁。

但是,麻煩的是開啟後,按不了F12,於是用python直接爬取頁面,才發現是這樣的。
在這裡插入圖片描述

123就是F12的code,這個網址禁止了F12,禁止了ctrl+shirt+i,禁止了ctrl+s。

但是這不影響啊,我們用urrlib.request可以獲得整個頁面的資訊。
每個圖片的文字描述資訊是在< h3>元素裡的。
每個圖片的下載地址是在< a class = “ctrl download”>元素裡的
總頁數資訊是在< div class=“page”>的< span>裡的。

每一頁面的url如下是:
https://bing.ioliu.cn/?p=1
https://bing.ioliu.cn/?p=2
https://bing.ioliu.cn/?p=3
https://bing.ioliu.cn/?p=4

完整程式碼如下:

import time
from concurrent.futures import ThreadPoolExecutor
import time
import os
import re
from urllib.parse import urlencode

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import  Options

rootrurl = 'https://bing.ioliu.cn/?'
save_dir = 'D:/estimages/'
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(
                    '{}/{}.jpg'.format(dir, title), '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]")  # 匹配不是中文、大小寫、數字的其他字元
    cop = re.compile("[^\u4e00-\u9fa5]")  # 匹配不是中文、大小寫、數字的其他字元
    string1 = cop.sub('', str)  # 將string1中匹配到的字元替換成空字元
    return string1


def getOnePage(i):
    params = {
        'p': i,
    }
    url = rootrurl + urlencode(params)
    print(url)
    html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")
    titles = html.find_all('h3')
    lis = html.find_all('a', {'class': 'ctrl download'})

    i = 0
    for a in lis:
        saveOneImg(save_dir, rootrurl[:-2] + a.get('href'), getSubTitleName(titles[i].get_text()))
        i = i + 1


def getNumOfPages():
    html = BeautifulSoup(requests.get(rootrurl, headers=headers).text, features="html.parser")
    return int(html.find('div', {'class': 'page'}).find('span').get_text().split('/')[1])


if __name__ == '__main__':
    getTotal = getNumOfPages()

    for i in range(1, getTotal+1):
        getOnePage(i)
    pass

效果如下:
請新增圖片描述

請新增圖片描述

相關文章