今日需要准备有关烟灰缸的图片数据集,用于烟灰缸检测的目标检测模型的训练。由于目前网上还没有关于烟灰缸的开源数据集,国内的图片网站一般需要收费,而国外的免费图片网站不支持批量下载。因此只能采用网络爬虫的方式去抓取有关烟灰缸的图片数据。
一番调研之后,选择了一家国外的图片网站,网址为: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
网友评论