python爬蟲入門---第三篇:自動下載圖片


適用的圖片網站:美桌

源代碼:

import requests
import re
import urllib
from bs4 import BeautifulSoup

def get_html_text(url):
    '''
    獲取網址url的HTML代碼,以字符串形式返回html代碼

    '''
    try:
        res = requests.get(url, timeout = 6)
        res.raise_for_status()
        res.encoding = res.apparent_encoding
        return res.text
    except:
        return ''
        print('請求異常')

def get_grupic_url(page_url, grupic_url_list, key_url, key_word):
    '''
    獲取每張頁面中每個圖冊的url鏈接,每個圖冊的url都有共同
    且有別於其他鏈接的url,我們把部分特征的字符串放在key_url
    中,通過它我們就可以篩選出頁面中所有圖冊的url

    '''
    page_html = get_html_text(page_url)
    #解析頁面的html代碼
    soup = BeautifulSoup(page_html, 'html.parser')
    #獲取該頁面html代碼中的所有<a>標簽
    a_tags = soup.find_all('a', attrs = {'href':True})

    select_atag(grupic_url_list, a_tags, key_url, key_word)

def get_allpages_url(cover_url, pages_url_list):
    '''通過遞歸獲取所有頁面的鏈接,
        直到該頁面不存在class = 'next'的<a>標簽

    '''
    html = get_html_text(cover_url)
    soup = BeautifulSoup(html, 'html.parser')
    #找到屬性class = 'next'的<a>標簽
    a_tags = soup.find_all('a', class_ = 'next')
    #如果<a>標簽存在,就將該標簽的url加入列表
    if a_tags:
        nextpage_url = a_tags[0].get('href')
        pages_url_list.append(nextpage_url)
        #遞歸獲取下一個頁面的<a>標簽
        get_allpages_url(nextpage_url, pages_url_list)
    #當不存在屬性class = 'next'的<a>標簽時,說明這是最后一頁,結束遞歸
    return None

def download_each_page(grupic_url_list, file_path1, page):
    '''
    通過調用download_each_group()函數,
    下載每一頁中的所有組圖

    '''
    print('\n\n第 {0} 頁開始下載:\n'.format(str(page)))

    gup = 1    #組數標記
    #下載該頁面中每個小相冊的所有圖片
    for grupic_url in grupic_url_list:
        file_path2 = file_path1 + '_{0}'.format(str(gup))
        #獲取該頁面的h1標題
        h1_string = get_h1_string(grupic_url)
        try:
            download_each_group(grupic_url, file_path2, h1_string, gup)
            gup += 1
        except:
            print("下載異常")
            gup += 1
            continue

def download_all_page(pages_url_list, file_path, key_url, key_word):
    '''通過調用函數download_each_page(),
        來下載所有頁面的圖片

    '''
    pages_num = len(pages_url_list)
    print('\n相冊一共有 {0} 頁,已經開始下載請您耐心等待...'.format(str(pages_num)))

    page = 1    #頁數標記
    for page_url in pages_url_list:
        grupic_url_list = []
        get_grupic_url(page_url, grupic_url_list, key_url, key_word)
        file_path1 = file_path + r'\{0}'.format(str(page))
        download_each_page(grupic_url_list, file_path1, page)
        page += 1

def download_each_group(grupic_url, file_path, h1_string, gup, n = 1):
    '''
    進入鏈接為grupic_url的圖冊,下載我們需要的大圖片,
    並遞歸進入下一個頁面開始下載,直到圖冊的h1標題發生改變

    ''' 
    new_file_path = file_path + '_{0}.jpg'.format(str(n))
    n += 1
    html = get_html_text(grupic_url)
    soup = BeautifulSoup(html, 'html.parser')
    #當該頁面的h1標題和小相冊封面的h1標題相同時開始下載
    if h1_string == soup.h1.string:
        #找到屬性class_ = 'pic-large'的img標簽
        img_tags = soup.find_all('img', class_ = 'pic-large')
        img_tag = img_tags[0]
        #下載該img標簽屬性data-original提供的url鏈接,即為目標圖片的鏈接
        urllib.request.urlretrieve(img_tag.get('data-original'), new_file_path)
        #獲取下一個頁面的鏈接
        next_url = img_tag.parent.get('href')
        print('第 {0} 組:{1}, 第 {2} 張下載完成啦'.format(str(gup), h1_string, str(n-1)))
        #遞歸下載下一個頁面的目標圖片
        download_each_group(next_url, file_path, h1_string, gup, n)
    #當h1標題不同時,說明進入到了另一個小相冊,結束遞歸
    return None

def get_h1_string(url):
    '''
    獲取網址為url網站的h1標簽內容

    '''
    try:
        html = get_html_text(url)
        soup = BeautifulSoup(html, 'html.parser')
        return soup.h1.string
    except:
        print('h1標題獲取異常')
        return ''

def select_atag(grupic_url_list, atags, key_url, key_word):
    for atag in atags:
        atag_string = str(atag)
        soup = BeautifulSoup(atag_string, 'html.parser')
        p = soup.p
        url = atag.get('href')
        if soup.img and p and re.search(key_word, p.string) and re.match(key_url, url):
            grupic_url_list.append(atag.get('href'))

def main():
    '''
    主函數

    '''
    #封面的url鏈接,也就是第一頁的url鏈接
    cover_url = 'http://www.win4000.com/mt/yangzi.html'
    #小相冊鏈接中有別於其他鏈接的特征字符串
    key_url = r'http://www.win4000.com/meinv'
    key_word = '楊紫'
    #圖片存放的目錄
    file_path = r'G:\pictures\yangzi'

    #存放所有頁面鏈接的列表
    pages_url_list = []
    #先將封面,即第一頁加入列表
    pages_url_list.append(cover_url)

    #獲取其他頁面的鏈接
    get_allpages_url(cover_url, pages_url_list)

    #下載所有頁面中所有圖片的函數
    download_all_page(pages_url_list, file_path, key_url, key_word)


main()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM