python抓取瀑布流网站的图片

今日需要准备有关烟灰缸的图片数据集,用于烟灰缸检测的目标检测模型的训练。由于目前网上还没有关于烟灰缸的开源数据集,国内的图片网站一般需要收费,而国外的免费图片网站不支持批量下载。因此只能采用网络爬虫的方式去抓取有关烟灰缸的图片数据。

一番调研之后,选择了一家国外的图片网站,网址为:https://unsplash.com

选择该网站的原因有二,一是该网站尚未发现存在反爬虫的设置,相比而言,国内许多网站的反爬虫机制比较完善,抓取这类网站的数据难度较大;二是该网站有大量的图片资源(有一些免费下载图片的网站的资源库相对匮乏)。

该网站在页面显示端采用的是瀑布流,即用户只需要控制滚动条即可实现传统网站中的分页功能。但由于没有了”下一页“按钮的存在,爬虫程序没办法一次性得到所有的网页链接,因此需要对传统的爬虫程序进行改进。

进入浏览器端,通过开发者模式查看前端向后台发送的数据请求。


1571063662799.png

上图是使用谷歌浏览器的示范,进入开发者模式,通过滑动滚动条触发网页的瀑布流机制,并观察开发者工具中network下的XHR所显示的请求信息,并得到请求的URL。通过观察此URL可知,一共有20页,此时处于第7页。
在浏览器端输入URL,可得到服务器端相应数据请求的返回。


1571064086748.png

返回类型是json,并且通过浏览器通过的查找功能可以观察得到需要下载图片的URL所处的位置。
在了解完上述信息之后,下面就可以开始编写爬虫程序。
"""

    烟灰缸图片抓取的样例。

    2019年10月14日14:40:13

"""
import urllib.request
import urllib
import requests

def download_img(paths):
    x = 0
    #一共有20页,i用于遍历所有的页。
    for i in range(1, 21):
        x = (i - 1) * 20
        target_url = 'https://unsplash.com/napi/search/photos?query=ashtray&xp=&per_page=20&page='+str(i)
        #得到网页的json数据
        jsondata = requests.get(target_url)
        data = jsondata.json()["results"]
        #pprint.pprint(data)  # 格式化打印获取的json

        for item in data:
            #得到图片的下载链接
            url = item.get("links").get("download")
            #打开url,下载图片到本地
            urllib.request.urlretrieve(url, '{0}{1}.jpg'.format(paths, x)) 
            x += 1
            print(x)

download_img("D:\\experiments\\datasets\\Ashtray_pics\\")

运行上述爬虫程序即可完成该网站的图片数据的抓取工作。


1571065013414.png
1571065028490.png

你可能感兴趣的:(python抓取瀑布流网站的图片)