利用斗图啦网站API批量下载表情图片
decorator.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
import os
from functools import wraps
#set the handler string format
FORMAT = '%(asctime)-15s %(filename)s %(message)s %(imageurl)s %(imagename)s'
logging.basicConfig(format=FORMAT,level=logging.INFO,filename="biaoqingDownloader.log",datefmt="[%Y-%m-%d %H:%M:%S]")
my_log_extra={"imageurl" :"","imagename":""}
#downloader logger
def downloader_logger(func) :
@wraps(func)
def wrapper(*args, **kwargs) :
func(*args,**kwargs)
try:
image_name=args[0]
image_url=args[1]
except KeyError as e:
raise e
my_log_extra["imagename"]=image_name
my_log_extra["imageurl"]=image_url
logging.info("biaoqingbaoDownloader downloaded image:",extra=my_log_extra)
return wrapper
if __name__ == '__main__':
## test this logger
@downloader_logger
def foo(filename,imageurl) :
print('logging test')
foo('test.png','www.baidu.com')
#if no error appears, clear the log file
with open('./biaoqingDownloader.log','w') as f :
f.truncate()
downloader.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
# @Link : https://github.com/coderchaser
import os
import time
import argparse
import requests
import random
import json
import threading
from decorator import downloader_logger
# code 0 represents https://www.doutula.com/apidoc
API_URL_DICT={0:"https://www.doutula.com/api/search?keyword={keyword}&mime={image_type}&page={page}"}
#random choice from these user agents
USER_AGENTS = ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0',
'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100 101 Firefox/22.0',
'Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0',
('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) '
'Chrome/19.0.1084.46 Safari/536.5'),
('Mozilla/5.0 (Windows; Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46'
'Safari/536.5'), )
class Downloader(object) :
def __init__(self,number,keyword,image_type,filepath,verbose,api_code=0) :
#TODO: self.__image_url_list defined as queue instead of list to support multi thread downloading
self.__image_url_list = []
#a list for storing image urls
self.__number = number
#the number of images to be downloaded
self.__api_code = api_code
#which site's api to choose. Currently only one.
self.__keyword = keyword
#keywords of the images
self.__image_type = image_type
#image type 0 :all kinds 1:GIF 2:static images
self.__filepath = filepath
#where to store those images
self.__verbose = verbose
#enable the verbose info?
def __get_image_url(self) :
for i in range(1,51) :
api_url=API_URL_DICT[self.__api_code].format(keyword=self.__keyword,image_type=self.__image_type,page=i)
try:
rq=requests.get(api_url,headers={'User-Agent':random.choice(USER_AGENTS)},timeout=5)
response_dict=rq.json()
self.__image_url_list.extend([entry['image_url'] for entry in response_dict['data']['list']])
#TODO: Can i use multi threads here? This is a kind of IO-intenseive work ?
if len(self.__image_url_list) >= self.__number:
break
if response_dict['data']['more'] != 1:
break;
except requests.ConnectionError as e:
print(e)
finally :
rq.close()# close exsists?
def __download(self):
self.__get_image_url()
print('Now downloading images from https://www.doutula.com ...')
if not os.path.exists(self.__filepath):
os.makedirs(self.__filepath)
for i in range(self.__number) :
image_url=self.__image_url_list[i]
if self.__verbose :
print("Dwonload images: {}".format(image_url))
extension='.'+image_url.split('.')[-1]
try:
filename=os.path.join(self.__filepath,'{0}{1}'.format(self.__keyword,i)+extension)
# self.image_download(filename,image_url)
download_rq=requests.get(image_url)
with open(filename,'wb') as f :
f.write(download_rq.content)
except Exception as e:
print(e)
time.sleep(1)
print("Images about {} have been downloaded.".format(self.__keyword))
def run(self) :
self.__download()
# @downloader_logger
# def image_download(self,filename,image_url):
# download_rq=requests.get(image_url)
# with open(filename,'wb') as f :
# f.write(download_rq.content)
def get_parser() :
parser = argparse.ArgumentParser(description="download interesting emoj images from www.doutula.com via command line")
parser.add_argument('keywords',metavar='KEYWORD',type=str,nargs='*',
help='the keywords to be searched')
parser.add_argument('-t','--type',type=int,default=0,choices=range(0,3),
help='choose image type to be downloaded. 0 represents all, 1 represents GIF , 2 represents static image')
parser.add_argument('-n','--num',type=int,default=50,
help='number of images to be downloaded')
parser.add_argument('-c','--clear',action='store_true',
help='enable clear the log file')
parser.add_argument('-d','--dir',type=str,
help='where to store the images, default is ./tmp/keyword/')
parser.add_argument('-v','--verbose',action='store_true',
help='enable show the whole downloading info')
return parser
def download(**kwargs):
for keyword in kwargs['keywords'] :
if kwargs['dir'] :
dirpath=kwargs['dir']+"/"+keyword
else :
dirpath='./tmp/'+keyword
print('Making dir:',dirpath)
downloader=Downloader(kwargs['num'],keyword,kwargs['type'],dirpath,kwargs['verbose'])
downloader.run()
def command_line_runner():
parser=get_parser()
kwargs=vars(parser.parse_args())
if kwargs['clear']:
with open('./biaoqingDownloader.log','w') as f:
f.truncate()
if not kwargs['keywords']:
#if no keywords assigned, return with help info
parser.print_help()
return
download(**kwargs)
if __name__ == '__main__':
###
#test this downloader
###
# downloader=Downloader(20,'金馆长',0,'./tmp',false)
# downloader.run()
command_line_runner()
代码以上传至Github,link
使用方法:python downloader.py -h
利用斗图啦网站API批量下载表情图片的更多相关文章
- 利用wget 抓取 网站网页 包括css背景图片
利用wget 抓取 网站网页 包括css背景图片 wget是一款非常优秀的http/ftp下载工具,它功能强大,而且几乎所有的unix系统上都有.不过用它来dump比较现代的网站会有一个问题:不支持c ...
- python多线程批量下载远程图片
python多线程使用场景:多线程采集, 以及性能测试等 . 数据库驱动类-简单封装下 mysqlDriver.py #!/usr/bin/python3 #-*- coding: utf-8 -*- ...
- python图片爬虫 - 批量下载unsplash图片
前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...
- C++代码利用pthread线程池与curl批量下载地图瓦片数据
项目需求编写的程序,稳定性有待进一步测试. 适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐 ...
- java实现批量下载百度图片搜索到的图片
就是写的个小程序,用于记录一下,方便后续查看,首先感谢下面这个博客,从这篇文章衍生的吧,大家可以学习下: http://www.cnblogs.com/lichenwei/p/4610298.html ...
- 用 Python 批量下载百度图片
为了做一个图像分类的小项目,需要制作自己的数据集.要想制作数据集,就得从网上下载大量的图片,再统一处理. 这时,一张张的保存下载,就显得很繁琐.那么,有没有一种方法可以把搜索到的图片直接下载到本地 ...
- 利用免费二维码API自动生成网址图片二维码
调用第三方接口生成二维码 官方地址:http://goqr.me/api/ 示例 https://api.qrserver.com/v1/create-qr-code/?size=180x180&am ...
- 批量下载网站图片的Python实用小工具
定位 本文适合于熟悉Python编程且对互联网高清图片饶有兴趣的筒鞋.读完本文后,将学会如何使用Python库批量并发地抓取网页和下载图片资源.只要懂得如何安装Python库以及运行Python程序, ...
- python爬虫我是斗图之王
python爬虫我是斗图之王 本文会以斗图啦网站为例,爬取所有表情包. 阅读之前需要对线程池.连接池.正则表达式稍作了解. 分析网站 页面url分析 打开斗图啦网站,简单翻阅之后发现最新表情每页包含的 ...
随机推荐
- 几种常见的Preference总结
DialogPreference共性 DialogPreference通用属性 说明 android:dialogIco 对话框的icon android:dialogLayout dialog的co ...
- SpringBoot+SpringCloud+vue+Element开发项目——集成MyBatis框架
添加mybatis-spring-boot-starter依赖 pox.xml <!--mybatis--> <dependency> <groupId>org.m ...
- 【JUC】8.CopyOnWriteArrayList源码分析
CopyOnWriteArrayList 解决脏读问题:牺牲写的效率,提高读的效率 CopyOnWriteArrayList是一种读写分离的思想体现的ArrayList: 它将读写的操作对象分离开来: ...
- h3c 802.11协议的发展进程
- [ipsec][strongswan] strongswan源码分析--(一)SA整体分析
strongswan SA分析(一) 1 概念 下面主要介绍两个本文将要阐述的核心概念.他们是SA和SP.注意,这不是一篇不需要背景知识的文章.作者认为你适合阅读接下来内容的的前提是,你已经具备了一下 ...
- 【转】高性能网络编程2----TCP消息的发送
在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字.操作TCP协议发送数据时,面对的是数据流.通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时, ...
- SHELL脚本编程的条件测试
SHELL脚本编程的条件测试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.条件测试概述 判断某需求是否满足,需要由测试机制来实现 专用的测试表达式需要由测试命令辅助完成测试过 ...
- SpringBoot找不到html资源的原因
SpringBoot在写完Controller之后直接启动访问,但是找不到相对应的页面资源,报404错误. 我的Controller编写没有错误,html文件也放在了templates文件夹下,但是为 ...
- Java精通并发-锁升级与偏向锁深入解析
对于synchronized关键字,我们在实际使用时可能经常听说用它是一个非常重的操作,其实这个“重”是要针对JDK的版本来说的,如今JDK已经到了12版本了,其实对这个关键字一直是存在偏见的,它底层 ...
- ModelForm的简单使用-注册用modelform编写
1.前端的ajax代码不用改动 2.modelform,在原来基础上稍作改动 from django import forms from app01.models import UserInfo fr ...