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

    
    
  • 相关阅读:
    PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)
    PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)
    PAT (Advanced Level) Practice 1028 List Sorting (25 分) (自定义排序)
    PAT (Advanced Level) Practice 1035 Password (20 分)
    PAT (Advanced Level) Practice 1019 General Palindromic Number (20 分) (进制转换,回文数)
    PAT (Advanced Level) Practice 1120 Friend Numbers (20 分) (set)
    从零开始吧
    Python GUI编程(TKinter)(简易计算器)
    PAT 基础编程题目集 6-7 统计某类完全平方数 (20 分)
    PAT (Advanced Level) Practice 1152 Google Recruitment (20 分)
  • 原文地址:https://www.cnblogs.com/fatyao/p/11141803.html
Copyright © 2011-2022 走看看