Python《爬取手機和桌面桌布》

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

此次爬取桌布網站,此網站全是靜態的,沒有反爬蟲手段,感覺是適合新手練手。
http://www.win4000.com/mobile.html
http://www.win4000.com/wallpaper.html
分別是手機桌布和桌面桌布。
比如點開手機桌布,我們會發現有很多標籤。
在這裡插入圖片描述

點開其中的標籤,進入到該標籤頁。
在這裡插入圖片描述

發現有很多的圖片組,且包含有分頁。
在這裡插入圖片描述

再最後點選某個圖片組可以發現有多張高清桌布
在這裡插入圖片描述
在這裡插入圖片描述

一個組圖中,html頁面的url是有規律的。
http://www.win4000.com/mobile_detail_178569_1.html
http://www.win4000.com/mobile_detail_178569_2.html
http://www.win4000.com/mobile_detail_178569_3.html
http://www.win4000.com/mobile_detail_178569_4.html
………

好了,頁面分析完畢。直接整程式碼:

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 = 'http://www.win4000.com/'
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):
    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, img_url.split('/')[-1].split('?')[0]), '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 processOnePage(tag, url):
    print('current group page is: %s' % url)

    html = BeautifulSoup(requests.get(url).text, features="html.parser")
    div = html.find('div', {'class': 'ptitle'})
    title = div.find('h1').get_text()
    num = int(div.find('em').get_text())

    tmpDir = '{}{}'.format(tag, title)
    if not os.path.exists(tmpDir):
        os.makedirs(tmpDir)

    for i in range(1, (num + 1)):
        tmpurl = '{}_{}{}'.format(url[:-5], i, '.html')
        html = BeautifulSoup(requests.get(tmpurl).text, features="html.parser")
        saveOneImg(tmpDir, html.find('img', {'class': 'pic-large'}).get('src'))
    pass


def processPages(tag, a_s):
    for a in a_s:
        processOnePage(tag, a.get('href'))
        time.sleep(1)
    pass


def tagSpiders(tag, url):
    while 1:
        html = BeautifulSoup(requests.get(url).text, features="html.parser")

        a_s = html.find('div', {'class': 'tab_box'}).find_all('a')
        processPages(tag, a_s)

        next = html.find('a', {'class': 'next'})
        if next is None:
            break
        url = next.get('href')
        time.sleep(1)
    pass


def getAllTags(taglist):
    list = {}
    for tag, url in taglist.items():
        html = BeautifulSoup(requests.get(url).text, features="html.parser")
        tags = html.find('div', {'class': 'cont1'}).find_all('a')[1:]
        for a in tags:
            list['{}{}/{}/'.format(save_dir, tag, a.get_text())] = a.get('href')
    return list

if __name__ == '__main__':
    # 獲得所有標籤
    list = {'手機桌布': 'http://www.win4000.com/mobile.html',
               '桌面桌布': 'http://www.win4000.com/wallpaper.html'}
    taglist = getAllTags(list)
    print(taglist)
    #
    # 給每個標籤配備一個執行緒
    with ThreadPoolExecutor(max_workers=40) as t:  # 建立一個最大容納數量為20的執行緒池
        for tag, url in taglist.items():
            t.submit(tagSpiders, tag, url)

    # 單個連線測試下下
    # tagSpiders('D:/estimages/手機桌布/美女/', 'http://www.win4000.com/mobile_2340_0_0_1.html')

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

效果如下:

請新增圖片描述

請新增圖片描述
請新增圖片描述
請新增圖片描述

相關文章