zoukankan      html  css  js  c++  java
  • 自学爬虫(三)

    小试牛刀:爬取壁纸网的壁纸

    今天偶然看到一个网站的壁纸很好看,于是想下载下来。可是每张图都要自己右键再下载,我觉得有点麻烦。于是尝试写了一个小程序来下载

    基本思路:根据图片url然后使用urlretrieve方法来下载这些图片

    由于这个网站是动态加载的,开始一直尝试了很多次,才知道只有抓包才能看到后台返回来的json格式

     

     

    再来分析图片的url

     

    如果是在网站里分析得到的url它只是缩略图,并不是高清的。这里也是通过抓包才发现的

    原url:

    https://th.wallhaven.cc/small/01/012ev4.jpg

     

    高清图url:

    https://w.wallhaven.cc/full/r7/wallhaven-r7x3dj.jpg

     

    发现json里面的i就是url最后面的代码

    于是我处理了一下这些json和url

    #文件名,里面存放json数据
    filename='lala'
    #打开文件
    file=open(filename,'r',encoding='utf-8')
    #读取文件
    text=file.read()
    #通过json.loads解析数据
    json = json.loads(text)
    #使用一个全局列表
    my_list=[]
    #获取需要的url代码,存入列表
    data_list =json['result']['records']
    print(len(data_list))
    #遍历这个列表
    for i in data_list:
        # print((i)['i'])
        #把这个特殊代码加入到列表
        my_list.append(i['i'])

    此时my_list里面存放的是那些特殊代码

    下面处理url和提取出来的特殊代码拼接成新的url

    #待拼接的url
    url = 'https://w.wallhaven.cc/full/'
    headers = {
        'User-Agent': 'Mozilla / 5.0(Windows NT 10.0 WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 79.0.3945.117Safari / 537.36'
    }
    x=40
    #遍历这个特殊代码列表
    for i in my_list[67:]:
        # print(i)
        # 提取前两个字母
        parse_add = i[0:2]
        # 把前两字母增加到url中
        new_url = url + parse_add
        # 再把wallhaven-4l37r4.jpg增加到url中
        new_new_url = new_url + '/wallhaven-' + i + '.jpg'
        print(new_new_url)

    拼接好图片的url,接下来就是访问并下载了

    #这里不能直接用urlretrieve,否则会返回403
        try:
            opener = urllib.request.build_opener()
            opener.addheaders = [('User-Agent',
                                      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
            urllib.request.install_opener(opener)
            urllib.request.urlretrieve(new_new_url, str(x)+'.jpg',Schedule)
        except urllib.error.HTTPError as e:
            print(str(e))
        x=x+1
        print('第%d张图片已下载完毕...^_^'%x)

    完整代码

    import urllib.request
    import urllib.parse
    import json
    import time
    import urllib.error
    
    
    def Schedule(blocknum,blocksize,totalsize):
         '''''
         blocknum:已经下载的数据块
         blocksize:数据块的大小
         totalsize:远程文件的大小
         '''
         per = 100.0 * blocknum * blocksize / totalsize
         if per > 100 :
             per = 100
         print('当前下载进度:百分之%d '%per)
    
    #文件名
    filename='lala'
    #打开文件
    file=open(filename,'r',encoding='utf-8')
    #读取文件
    text=file.read()
    #通过json解析数据
    json = json.loads(text)
    #使用一个全局列表
    my_list=[]
    #获取需要的url代码,存入列表
    data_list =json['result']['records']
    print(len(data_list))
    #遍历这个列表
    for i in data_list:
        # print((i)['i'])
        #把这个特殊代码加入到列表
        my_list.append(i['i'])
    
    #待拼接的url
    url = 'https://w.wallhaven.cc/full/'
    headers = {
        'User-Agent': 'Mozilla / 5.0(Windows NT 10.0 WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 79.0.3945.117Safari / 537.36'
    }
    x=40
    #遍历这个特殊代码列表
    for i in my_list[67:]:
        # print(i)
        # 提取前两个字母
        parse_add = i[0:2]
        # 把前两字母增加到url中
        new_url = url + parse_add
        # 再把wallhaven-4l37r4.jpg增加到url中
        new_new_url = new_url + '/wallhaven-' + i + '.jpg'
        print(new_new_url)
        #这里不能直接用urlretrieve,否则会返回403
        try:
            opener = urllib.request.build_opener()
            opener.addheaders = [('User-Agent',
                                      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
            urllib.request.install_opener(opener)
            urllib.request.urlretrieve(new_new_url, str(x)+'.jpg',Schedule)
        except urllib.error.HTTPError as e:
            print(str(e))
        x=x+1
        print('第%d张图片已下载完毕...^_^'%x)

    效果图:

     

     

  • 相关阅读:
    leetcode 13. Roman to Integer
    python 判断是否为有效域名
    leetcode 169. Majority Element
    leetcode 733. Flood Fill
    最大信息系数——检测变量之间非线性相关性
    leetcode 453. Minimum Moves to Equal Array Elements
    leetcode 492. Construct the Rectangle
    leetcode 598. Range Addition II
    leetcode 349. Intersection of Two Arrays
    leetcode 171. Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/hongweijiang/p/12206398.html
Copyright © 2011-2022 走看看