zoukankan      html  css  js  c++  java
  • python爬虫练手--糗事百科图片获取

    啥也不说了,直接上代码吧,原先我就比较喜欢糗事百科,工作累了,或者遇到烦心难受的事情,总喜欢来着看看的,用它做练习,就当是给它做个推广了。

    (ps:这个爬虫代码简单易懂,小白练手够用了,里面有些地方写的比较繁琐,效率不高,但是参考练手一下,还是可以的)

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import urllib.request
    import http.client
    import ssl
    import gzip
    import zlib
    import re
    import urllib.error as error
    import os

    # 取消全局的ssl认证
    ssl._create_default_https_context = ssl._create_unverified_context


    def gzip_decompress(data):
    try: # 尝试解压
    print('正在使用gzip解压.....')
    data = gzip.decompress(data)
    print('gzip解压完毕!')
    except:
    print('未经gzip压缩, 无需解压')
    return data


    # deflate压缩算法
    def deflate_decompress(data):
    try:
    print('正在使用deflate解压.....')
    return zlib.decompress(data, -zlib.MAX_WBITS)
    print('deflate解压完毕!')
    except zlib.error:
    return zlib.decompress(data)

    ###获取糗事百科所有图片网页的url,并存入函数
    ###如果知道多少页,可以修改这个函数为对应的页数,已经知道糗事百科有13页图片
    def url_all():
    result = []
       #图片网页数量共13页,利用循环获取
    for i in range(1, 14):
    result.append('https://www.qiushibaike.com/imgrank/page/%u' %i)
    return result

    ##创建目录页的文件夹
    def dirpath_all():
    base = 'E:/爬虫数据/1.糗百图片/'
    #对应网页数量,创建存放目录
    for i in range(1,14):
    dirpathmkdir = base + str(i)
    if os.path.exists(dirpathmkdir):
    print('%s'"已经存在" % dirpathmkdir)
    else:
    os.makedirs(dirpathmkdir)
    print('%s'"不存在!刚刚已经创建" %dirpathmkdir)



    # 封装头信息,伪装成浏览器
    header = {
    'Connection': 'Keep-Alive',
    'Accept-Language': 'zh-CN,zh;q=0.8',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    #'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    'Accept-Encoding': 'gzip, deflate',
    'X-Requested-With': 'XMLHttpRequest',
    }
    #网页地址list取出是从0开始的,一共13个地址元素
    for i in range(0,13):
    #获取网页地址
    url = url_all()[i]
    #进入目录结构参数的默认值为a=1,默认从"E:/爬虫数据/1.糗百图片/1/"开始
    a = 1
    try:
    # 使用包含header的信息,进行请求
    request = urllib.request.Request(url, headers=header)
    # 通过urlopen打开包含header的url链接,用来获取数据
    response = urllib.request.urlopen(request)
    except urllib.error.HTTPError as e:
    print(e.code)
    except urllib.error.URLError as e:
    print(e.reason)
    except http.client.error as e:
    print(e)
    else:
    # 读取返回的结果
    content = response.read()
    # 用于判断是何种压缩算法,如果是gzip则调用gzip算法
    encoding = response.info().get('Content-Encoding')
    # 判断使用的是不是gzip压缩算法
    if encoding == 'gzip':
    content = gzip_decompress(content).decode(encoding='utf-8', errors='strict')
    # deflate很少有人在用了,老网站可能用,这里也判断一下
    elif encoding == 'deflate':
    content = deflate_decompress(content)
    # 这里获取了所有的img链接,包括头像什么的。
    imgre = re.compile('<img src="(.+?)"')
    imglist = imgre.findall(content) # re.findall() 方法读取html 中包含 imgre(正则表达式)的 数据
    print(imglist)

    # 把筛选的图片地址通过for循环遍历并保存到本地
    # 核心是urllib.urlretrieve()方法,直接将远程数据下载到本地,图片通过x依次递增命名
    x = 0
         #确认是否创建对应网页的存放图片的目录,如果有则跳过忽略,没有则创建
    dirpath_all()
         #配合list的取值参数i,使得a对应的值发生变化,并进入到相应的目录中,开始下载
    a += i
         #确定目录地址
    dirpath = 'E:/爬虫数据/1.糗百图片/%s/' %a

    for imgurl in imglist:
    # 将正则表达式编译 成pattern对象
    pattern = re.compile('w?//pic.qiushibaike.com/.*.jpg')
    # 进行匹配查找
    if pattern.match(imgurl):
    # 如果匹配成功则进行下载,保存到本地文件夹
    try:
    # 糗百的html代码 中 关于图片的代码,没有http,需要手动加上
    image_data = urllib.request.urlopen("https:" + imgurl).read()
    image_path = dirpath + str(x) + '.jpeg'
    x += 1
    print(image_path)
    with open(image_path, 'wb') as image_file:
    image_file.write(image_data)
    image_file.close()
    except error.URLError as e:
    print('Download failed')

    
    
  • 相关阅读:
    Qt使用第三方库3rdparty
    Qt5.5以来对Network的改进(包括对SSL的功能支持,HTTP的重定向等等)
    ddd
    C# ICSharpCode.SharpZipLib
    OWIN
    C#/.NET code
    ABP启动配置
    Oracle表空间及分区表
    Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
    WebAPI使用多个xml文件生成帮助文档
  • 原文地址:https://www.cnblogs.com/fatyao/p/11141803.html
Copyright © 2011-2022 走看看