这里给大家介绍一个,个人觉得非常好的图片网站:https://unsplash.com/
这个网站里的图片全是可以免费下载的,最重要的是,它的图片不仅精美而且图片质量超高!所以,你只的拥有。
既然可以免费下载那为什么还要用爬虫呢?这个嘛,确实不需要, =。= 就当我闲的蛋疼吧。
首先,这是一个ajax的网站,所以,我们打开火狐浏览器,打开上方网址,进入网站后依次点击F12,网络,XHR,这时刷新下网页,就能看见如图的样子,这就是存放图片信息的json文件了
然而事实上,这还不是我们需要的链接,这个链接长这样:https://unsplash.com/napi/photos?page=2&per_page=2&order_by=latest
当我们将网页往下翻时,会出现这样的链接:https://unsplash.com/napi/photos?page=3&per_page=12&order_by=latest
二者区别在于后者page是从3开始的,我试了下,page=1也是有内容的;第二个区别在后者的per_page=12,
打开链接,查看json文件,发现无损的原图放在urls的raw下
好了,分析完毕,进入代码实操。
data = json.loads(requests.get(url,headers=get_user_hearder()).text)
首先获得我们需要的json文件
然后进入下载
def download_images(data,path):
image_list=[]
image_id=[]
for i in range(0,len(data)):
image_url=data[i]['urls']['raw']
image_list.append(image_url)
name=data[i]['id']
image_id.append(name)
for i in range(0,len(image_list)):
auto_down(image_list[i],path + str(image_id[i])+'.jpg'
print('第' + str(i) + '个图片下载完成')
我们在下图片时经常会遇到下载失败的情况,其中有种情况是出现urllib.ContentTooShortError错误,原因是文件下载不完全导致的错误,为防止图片下载失败,我用了一个大神的自动下载方法(https://blog.csdn.net/jclian91/article/details/77513289),当下载异常时,自动重新下载,超时会跳出循环。
def auto_down(url,filename):
socket.setdefaulttimeout(30)
try:
urllib.request.urlretrieve(url, filename)
except socket.timeout:
count = 1
while count <= 5:
try:
urllib.request.urlretrieve(url, filename)
break
except socket.timeout:
err_info = 'Reloading for %d time' % count if count == 1 else 'Reloading for %d times' % count
print(err_info)
count += 1
if count > 5:
print("downloading picture failed!")
好了,最后输入以下开始下载的页号、停止下载的页号和图片保存的路径就可以跑了
def main(start,end,path):
for i in range(start,end):
url='https://unsplash.com/napi/photos?page='+str(i)+'&per_page=12&order_by=latest'
data=getdata(url)
download_images(data,path)
print('第'+str(i)+'页下载完成')
最后的最后,放两张我下载的美图吧
额,原图有些大,我缩小了下。