• python爬取百度图片


    1. 首先通过urllib获取网页的源码

    # 定义一个getHtml()函数
    def getHtml(url):
        try:
            page = urllib.urlopen(url)  # urllib.urlopen()方法用于打开一个URL地址
            html = page.read()  # read()方法用于读取URL上的数据
        except Exception as e:
            html = ''
        return html

    2. 获取下一页的url链接,当本页的图片链接获取完毕,再继续获取下一页的。使用Python正则表达式匹配需要的字段

    # 得到下一页的url
    def get_page_url(html):
        url_reg = r'<a href="(.*)">下一页</a>'
        url_pattern = re.compile(url_reg)
        fanye_urls = url_pattern.findall(html)
        fanye_url = 'https://tieba.baidu.com' + fanye_urls[0] if fanye_urls else ''
        return fanye_url

    3. 获取每一页的图片链接,将之放入一个总的数组,最后通过链接下载图片

    def getImg(html):
        img_reg = r'https://.[^s]+?.jpg|https://.[^s]+?.png'  # 正则表达式,得到图片地址
        img_pattern = re.compile(img_reg)  # re.compile() 可以把正则表达式编译成一个正则表达式对象.
        imgList = img_pattern.findall(html)  # img_pattern.findall() 方法读取html 中包含 img_reg(正则表达式)的  数据,数组形式
        return imgList

    4. 下载图片。使用urllib.urlretrieve()方法,直接根据链接将图片下载到本地

    def down_img(imgList):
        x = 0
        for imgUrl in imgList:
            try:
                # 核心是urllib.urlretrieve()方法,直接将远程数据下载到本地,图片通过x依次递增命名
                urllib.urlretrieve(imgUrl, 'E:img\%s.jpg' % str(x + 1))
                print '成功下载第%s张图片时:%s' % (str(x + 1), str(imgUrl))
                x += 1
            except Exception as e:
                print '下载第%s张图片时失败:%s' % (str(x + 1), str(imgUrl))
                print e
                continue
        return imgList

    5. 先爬取第一页的图片链接,然后通过while循环,继续读取第二页,.....,等到最后,将所有从网上爬取的图片链接使用extend()方法放入总的数组内,然后统一下载

    all_img_urls = []
        # 得到网页源码
        html = getHtml("https://tieba.baidu.com/p/5407739329")
        fanye_url = get_page_url(html)
        # 得到图片链接的数组
        imgList = getImg(html)
        # 将imgList数组存入总的图片数组内
        all_img_urls.extend(imgList)
        fanye_count = 0  # 累计翻页数
        while 1:
            try:
                next_html = getHtml(fanye_url)
                fanye_url = get_page_url(next_html)
                next_imgList = getImg(next_html)
                fanye_count += 1
                print('第%s页' % fanye_count)
                all_img_urls.extend(next_imgList)
                if fanye_url == '' and next_imgList == []:
                    print('已到最后一页, 开始下载:')
                    break
            except Exception as e:
                print e
                continue
        down_img(all_img_urls)

    总的代码如下:

    # coding=utf-8
    """下载百度贴吧内的图片"""
    import re
    import urllib
    
    
    # 定义一个getHtml()函数
    def getHtml(url):
        try:
            page = urllib.urlopen(url)  # urllib.urlopen()方法用于打开一个URL地址
            html = page.read()  # read()方法用于读取URL上的数据
        except Exception as e:
            html = ''
        return html
    
    
    # 得到下一页的url
    def get_page_url(html):
        url_reg = r'<a href="(.*)">下一页</a>'
        url_pattern = re.compile(url_reg)
        fanye_urls = url_pattern.findall(html)
        fanye_url = 'https://tieba.baidu.com' + fanye_urls[0] if fanye_urls else ''
        return fanye_url
    
    
    def getImg(html):
        img_reg = r'https://.[^s]+?.jpg|https://.[^s]+?.png'  # 正则表达式,得到图片地址
        img_pattern = re.compile(img_reg)  # re.compile() 可以把正则表达式编译成一个正则表达式对象.
        imgList = img_pattern.findall(html)  # img_pattern.findall() 方法读取html 中包含 img_reg(正则表达式)的  数据,数组形式
        return imgList
    
    
    def down_img(imgList):
        x = 0
        for imgUrl in imgList:
            try:
                # 核心是urllib.urlretrieve()方法,直接将远程数据下载到本地,图片通过x依次递增命名
                urllib.urlretrieve(imgUrl, 'E:img\%s.jpg' % str(x + 1))
                print '成功下载第%s张图片时:%s' % (str(x + 1), str(imgUrl))
                x += 1
            except Exception as e:
                print '下载第%s张图片时失败:%s' % (str(x + 1), str(imgUrl))
                print e
                continue
        return imgList
    
    
    if __name__ == '__main__':
        all_img_urls = []
        # 得到网页源码
        html = getHtml("https://tieba.baidu.com/p/5407739329")
        fanye_url = get_page_url(html)
        # 得到图片链接的数组
        imgList = getImg(html)
        # 将imgList数组存入总的图片数组内
        all_img_urls.extend(imgList)
        fanye_count = 0  # 累计翻页数
        while 1:
            try:
                next_html = getHtml(fanye_url)
                fanye_url = get_page_url(next_html)
                next_imgList = getImg(next_html)
                fanye_count += 1
                print('第%s页' % fanye_count)
                all_img_urls.extend(next_imgList)
                if fanye_url == '' and next_imgList == []:
                    print('已到最后一页, 开始下载:')
                    break
            except Exception as e:
                print e
                continue
        down_img(all_img_urls)
  • 相关阅读:
    关于meta便签详解
    移动端等分比显示导航状态
    css3单选 复选按钮--代码分享
    css-样式重构-代码分享
    代码分享h5-sessionStorage,提示app下载代码块
    微信浏览器打开 点击下载app 无需提示使用浏览器打开--代码分享
    js 判断IOS版本号
    二进制,八进制,十进制,十六进制之间的转换
    JS组件系列——Bootstrap文件上传组件:bootstrap fileinput
    Bootstrap文件上传插件File Input的使用
  • 原文地址:https://www.cnblogs.com/createboke/p/8359164.html
Copyright © 2020-2023  润新知