'''
爬取一个网站我们首先要对网站的结构进行分析。
天堂网网址www.ivsky.com
首页是有两个图片大分类分别为图片素材和桌面壁纸地址分别为
/tupian    /bizhi
两个大分类下是各个小分类url地址的形式是如 /bizhi/nvxing
点击小分类后展示的是各个图片小合集页面地址形式为   /bizhi/nvxing/index_1.html (这里可以改变页码进行循环)
在这个页面我们可以获取到每一个小合集的地址形式为  /bizhi/zhangtianai_v43460/
在每个小合集里面就是每张图片的具体地址了 http://img.ivsky.com/img/bizhi/t/201708/31/zhangtianai.jpg
通过观察可以通过这个地址构造出高清图片的下载地址 只需将t换为pic即可
http://img.ivsky.com/img/bizhi/pic/201708/31/zhangtianai.jpg
'''

header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64)" 
+"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"}

#由于该网站只有两个大分类所以我们直接手动构造不用去爬取了。
catalogue = ['tupian','bizhi']

#保存小分类的列表
s_catalogue_list = []
#保存小分类的列表的中文名称。

url = "http://www.ivsky.com"
request = urllib.request.Request(url)   
response = urllib.request.urlopen(request)#第一个页面   
html = response.read().decode('utf8')
pattern = re.compile('<a href="(.*?)"[\s\S]*?class="kw_.*?>.*?') 
result = re.finditer(pattern, html)
for a in result:
    s_catalogue_list.append(a.group(1))
    
    
#对结果进行整理去掉不要的东西
for a in s_catalogue_list:
    if (a.count('/')!=3):
        s_catalogue_list.remove(a)

#接下来通过获取得到的小分类构造图片合集页面并分别访问
#如 /bizhi/nvxing/index_1.html (这里可以改变页码进行循环)

for a in s_catalogue_list:
#获取各个小分类的名称并创建一个大文件夹
    
    #在这里定制要下载的分类,可以去掉 
    #去掉的话默认下载全部分类--请确定你的内存足够大(去掉后注意去除一个tab空格)
    if (a=='/bizhi/nvxing/'):
        url = "http://www.ivsky.com"+a
        request = urllib.request.Request(url) 
        response = urllib.request.urlopen(request)
        html = response.read().decode('utf8')
        pattern = re.compile('(.*?)')
        result1 = re.finditer(pattern,html)
        
        cur_dir = 'G:/eclipse/spider/tupian'#注意此处的斜杠  此处的文件夹要自己创建
        for name in result1:
            if not os.path.exists(cur_dir+'/'+name.group(1)):#判断文件夹是否已经存在
                os.mkdir(os.path.join(cur_dir,name.group(1)))
            cur_dir =cur_dir+'/'+name.group(1)    
        
    #判断有多少个/bizhi/nvxing/index_1.html这样的页面        
    
        #page处可以自己定制要下载多少页
        page = 100
        result1 = []
        while (len(result1)==0):
            url1 = "http://www.ivsky.com"+a+"index_"+str(page)+".html"
            try:
                request = urllib.request.Request(url1) 
                response = urllib.request.urlopen(request)
                html = response.read().decode('utf8')
                pattern = re.compile('')
                result1 = re.findall(pattern,html)
            except urllib.error.HTTPError as e:
                error1 = e.code
                #print(response)    
            page = page-1
            
    #获取到了每个小分类有多少个page
    #然后依次访问每个小分类的小合集页面抓取/bizhi/zhangtianai_v43460/这种图片专辑地址
        page = page+1
        while(page>=1):
            url2 = "http://www.ivsky.com"+a+"index_"+str(page)+".html"
            request2 = urllib.request.Request(url2,headers=header) 
            response2 = urllib.request.urlopen(request2)
            html2 = response2.read().decode('utf8')
            pattern2 = re.compile('<a href="(.*?)" title="(.*?)"[\s\S]*?<img[\s\S]*?')
            result2 = re.finditer(pattern2,html2)
            for v in result2:
                #print(v.group(1))
                #print(v.group(2))
                #创建最小图片合集文件夹
                if not os.path.exists(cur_dir+'/'+v.group(2)):#判断文件夹是否已经存在
                    os.mkdir(os.path.join(cur_dir,v.group(2)))
                    final_dir = cur_dir+'/'+v.group(2)
                    
                    #最后访问获取到的链接在进一步抓取最后的图片地址
                    #如http://img.ivsky.com/img/bizhi/t/201708/31/zhangtianai.jpg
                       
                    url3 = "http://www.ivsky.com"+v.group(1)
                    request3 = urllib.request.Request(url3,headers=header) 
                    response3 = urllib.request.urlopen(request3)
                    html3 = response3.read().decode('utf8')
                    pattern3 = re.compile('<a href=[\s\S]*?<img src="(.*?)"[\s\S]*?')
                    result3 = re.finditer(pattern3,html3)
                    for s in result3:
                #对m或t进行替换#把其中的t换为pic 
                        b = re.sub("(/t/)|(/m/)", "/pic/", s.group(1))
                        
                    #替换完后访问最终地址并下载
                        #这一个header头一定要加上不然娶不到图片
                        header1 = {'Referer':b,'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) '+
                                   'AppleWebKit/537.36 (KHTML, like Gecko) '+
                                   'Chrome/55.0.2883.87 Safari/537.36','If-Modified-'+
                                   'Since':'Tue, 27 Oct 2015 14:21:59 GMT'
        ,'If-None-Match':'W/"562f8887-b9e"'}
                        array1 = b.split('/')
                        picture = urllib.request.urlopen(urllib.request.Request(b,headers=header1))
                        data = picture.read()
                        os.chdir(final_dir)
                        if not os.path.exists(array1[len(array1)-1]):
                            f = open(array1[len(array1)-1], 'wb')
                            f.write(data)
                            f.close()  
                print(v.group(2)+"下载完成") 
         
            page = page-1

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐