zoukankan      html  css  js  c++  java
  • 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('
    
    第 {0} 页开始下载:
    '.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('
    相册一共有 {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:picturesyangzi'
    
        #存放所有页面链接的列表
        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()
    蒹葭苍苍,白露为霜; 所谓伊人,在水一方。
  • 相关阅读:
    SpringCloud学习笔记(6)——Eureka高可用
    上传大数据到SharePoint 2010
    批量导入导出站点权限site permissions
    List does not exist. The page you selected contains a list that does not exist. It may have been deleted by another user
    Change upload file limit in specified Webapllication in SharePoint (PowerShell)
    导出SharePoint2013用户及权限
    启用SharePoint 2013文档版本控制
    移除SharePoint2013里的NoteBook笔记本链接
    启用SharePoint 的 web application下面所有站点“备用语言”
    SharePoint 2013 event id 8321 错误
  • 原文地址:https://www.cnblogs.com/huwt/p/10360543.html
Copyright © 2011-2022 走看看