Skip to content

Instantly share code, notes, and snippets.

@TypeA2
Last active January 2, 2024 03:40
Show Gist options
  • Save TypeA2/520d30b32b9e37d2700fe01ea80ea054 to your computer and use it in GitHub Desktop.
Save TypeA2/520d30b32b9e37d2700fe01ea80ea054 to your computer and use it in GitHub Desktop.
Download all images on danbooru by tag
import sys, os, requests, json, time, math
if len(sys.argv) < 2:
print("Tags not specified")
sys.exit(1)
elif sys.argv[1].count(" ") > 1:
print("Maximum of 2 arguments")
sys.exit(1)
tags = sys.argv[1]
tags_url = tags.replace(" ", "+")
output_path = "./"
if len(sys.argv) < 3:
output_path += "".join([c for c in sys.argv[1] if c.isalpha() or c.isdigit() or c == " " or c == "(" or c == ")" or c == "_"]).rstrip().replace(" ", "_")
else:
output_path = sys.argv[2]
try:
os.mkdir(output_path)
except FileExistsError:
pass
print("Tags:\t\t{0}".format(tags))
print("Output:\t\t{0}".format(output_path))
post_count = json.loads(requests.get("https://danbooru.donmai.us/counts/posts.json?tags={0}".format(tags_url)).text)["counts"]["posts"]
print("# of posts:\t{0}".format(post_count))
page_count = math.ceil(post_count / 200)
count = 0
start = time.time()
for p in range(page_count):
posts = json.loads(requests.get("https://danbooru.donmai.us/posts.json?tags={0}&page={1}&limit=200".format(tags_url, p + 1)).text)
for post in posts:
count += 1
try:
print("Downloading {0}, {1} of {2}, elapsed: {3} seconds".format(post["id"], count, post_count, round(time.time() - start, 2)))
image_fname = post["file_url"][post["file_url"].rfind("/") + 1:]
image = requests.get(post["file_url"]).content
except KeyError:
print("Skipping {0}, {1} of {2}, elapsed: {3} seconds".format(post["id"], count, post_count, round(time.time() - start, 2)))
f = open("{0}/{1}".format(output_path, image_fname), "wb")
f.write(image)
f.close()
print("Downloaded {0} posts in {1} seconds".format(count, round(time.time() - start, 2)))

python danbooru_download.py <tags> [output_path]

Tags: maximum of 2 tags Output path: defaults to a path based on the tags if not specified

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment