huwt

适用的图片网站:美桌

源代码:

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()

 

分类:

技术点:

相关文章:

  • 2021-07-21
  • 2021-06-14
  • 2022-01-01
  • 2022-12-23
  • 2021-11-30
  • 2021-12-10
  • 2021-11-23
猜你喜欢
  • 2022-12-23
  • 2021-11-30
  • 2021-11-26
  • 2021-12-10
  • 2021-11-23
  • 2021-05-06
  • 2021-06-29
相关资源
相似解决方案