大家好,欢迎来到IT知识分享网。
''' 爬取一个网站我们首先要对网站的结构进行分析。 天堂网网址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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/26120.html