喜欢写文章的都知道,有时候有一些好的配图会使得文章看起来更加的丰富,最近我就在想能不能写一个而工具来获取我想要的图片,分类存储,方便我以后写东西用。下面我就分享下我的成果。
目标源网址:
找了很多网站,但是比较后还是百度图片信息比较全一点。而且图片质量也比较好。
采用scrapy中的ImagesPipeline来下载图片
class DownImgloadPipeline(ImagesPipeline):
"""docstring for DoubanDownloadPipeline"""
def get_media_requests(self, item, info):
default_headers = {
'accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
'Host': 'img5.imgtn.bdimg.com',
'referer': item['refere'],
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
yield scrapy.Request(item['url'],headers=default_headers,meta={"item":item})
def file_path(self, request, response=None, info=None):
print(response)
item = request.meta["item"]
# 再从item中取出分类名称,这个name就是我们想自定义图片路径的文件名称,(如果不自定义file_path函数的话,默认会将图片下载到full文件里)
name = item['path']
# 再从item中取出img_url,分隔出来图片的名称.图片的网址一般最后一个'/'后都是数字,此处用它作图片的名字
img_url_name = item['name']+'.jpg'
return "%s/%s" % (name, img_url_name)
# print(request)
def item_completed(self, results, item, info):
pass
get_media_requests:图片下载请求;file_path:定义存储路径
settings文件配置你想要搜索的关键字
spider代码如下:
def start_requests(self):
name_list = picture_name
for name in name_list:
for i in range(2):
num = 0
url = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={0}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word={0}&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&expermode=&force=&pn={1}&rn=30'.format(name,num)
num = num + 30
yield scrapy.Request(url,callback=self.parse_item,meta={'path':name})
def parse_item(self,response):
path = response.meta['path']
data = json.loads(response.body_as_unicode())['data']
for i in data:
item = DownloadpictureItem()
name = i['fromPageTitleEnc']
url = i['thumbURL']
item['url'] = url
item['name'] = name
item['path'] = path
item['refere'] = response.url
yield item
效果如下:
以关键字为目录,以后写文章直接挑选就ok了!