图片爬虫——unsplash爬虫

一.日常扯淡

 

这里给大家介绍一个,个人觉得非常好的图片网站: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)+'页下载完成')

最后的最后,放两张我下载的美图吧

 

额,原图有些大,我缩小了下。

  

 

注:原创,转载请注明出处。文中图片来自https://unsplash.com

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值