'''
爬取一个网站我们首先要对网站的结构进行分析。
天堂网网址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
版权声明:本文为qq_38120760原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。