Files
Wallhaven-dl/wallhaven-dl.py
Tempest042 9c4fdf121d Updates to work with Wallhaven Post Alpha
Wallhaven recently came out of aplha, making many changes to their website.

I've updated the scraper to make it work again.
This Rewrites part of the script to work with the new API.
Currently the only way to get NSFW images in search results is to use the API access along with an API Key.
The updated scraper now uses the API to load the search results page / categories page/ lastest page.
Users dont require API access to view full resolution NSFW Images, so we can access all the images through the original method.
We use the original method grab the Full Resoultion Photo, except this time we have the actual image path so we dont need to guess the file extension.

The API requires an API key which you can get by creating a Wallhaven Account. The API Key is under User Menu->Settings->Account.
Instead of showing the lastest page it will now show the toplist page for the past month as we cant access the lastest page with the API.

The API is limited to 45 calls per minute, but as we only call the API to load new pages (of 24 images) and not to download the actual images, this should limit should never be reached.
2019-06-11 00:30:40 +10:00

131 lines
4.5 KiB
Python

########################################################
# Program to Download Wallpapers from #
# alpha.wallhaven.cc #
# #
# Author - Saurabh Bhan #
# #
# Dated- 26 June 2016 #
# Update - 11 June 2019 #
########################################################
import os
import getpass
import re
import requests
import tqdm
import time
import urllib
import json
os.makedirs('Wallhaven', exist_ok=True)
BASEURL=""
cookies=dict()
global APIKEY
APIKEY = "EnterYourAPIKeyHere"
def category():
global BASEURL
print('''
****************************************************************
Category Codes
all - Every wallpaper.
general - For 'general' wallpapers only.
anime - For 'Anime' Wallpapers only.
people - For 'people' wallapapers only.
ga - For 'General' and 'Anime' wallapapers only.
gp - For 'General' and 'People' wallpapers only.
****************************************************************
''')
ccode = input('Enter Category: ').lower()
ctags = {'all':'111', 'anime':'010', 'general':'100', 'people':'001', 'ga':'110', 'gp':'101' }
ctag = ctags[ccode]
print('''
****************************************************************
Purity Codes
sfw - For 'Safe For Work'
sketchy - For 'Sketchy'
nsfw - For 'Not Safe For Work'
ws - For 'SFW' and 'Sketchy'
wn - For 'SFW' and 'NSFW'
sn - For 'Sketchy' and 'NSFW'
all - For 'SFW', 'Sketchy' and 'NSFW'
****************************************************************
''')
pcode = input('Enter Purity: ')
ptags = {'sfw':'100', 'sketchy':'010', 'nsfw':'001', 'ws':'110', 'wn':'101', 'sn':'011', 'all':'111'}
ptag = ptags[pcode]
BASEURL = 'https://wallhaven.cc/api/v1/search?apikey=' + APIKEY + "&categories=" +\
ctag + '&purity=' + ptag + '&apikey=zsUUdO08GzEyf8q7wrVqY3hNKrwKWFSm' + '&page='
def latest():
global BASEURL
print('Downloading latest')
topListRange = '1M'
BASEURL = 'https://wallhaven.cc/api/v1/search?apikey=' + APIKEY + '&topRange=' +\
topListRange + '&sorting=toplist&page='
def search():
global BASEURL
query = input('Enter search query: ')
BASEURL = 'https://wallhaven.cc/api/v1/search?apikey=' + APIKEY + '&q=' + \
urllib.parse.quote_plus(query) + '&page='
def downloadPage(pageId, totalImage):
url = BASEURL + str(pageId)
urlreq = requests.get(url, cookies=cookies)
pagesImages = json.loads(urlreq.content);
pageData = pagesImages["data"]
for i in range(len(pageData)):
currentImage = (((pageId - 1) * 24) + (i + 1))
url = pageData[i]["path"]
filename = os.path.basename(url)
osPath = os.path.join('Wallhaven', filename)
if not os.path.exists(osPath):
imgreq = requests.get(url, cookies=cookies)
if imgreq.status_code == 200:
print("Downloading : %s - %s / %s" % (filename, currentImage , totalImage))
with open(osPath, 'ab') as imageFile:
for chunk in imgreq.iter_content(1024):
imageFile.write(chunk)
elif (imgreq.status_code != 403 and imgreq.status_code != 404):
print("Unable to download %s - %s / %s" % (filename, currentImage , totalImage))
else:
print("%s already exist - %s / %s" % (filename, currentImage , totalImage))
def main():
Choice = input('''Choose how you want to download the image:
Enter "category" for downloading wallpapers from specified categories
Enter "latest" for downloading latest wallpapers
Enter "search" for downloading wallpapers from search
Enter choice: ''').lower()
while Choice not in ['category', 'latest', 'search']:
if Choice != None:
print('You entered an incorrect value.')
choice = input('Enter choice: ')
if Choice == 'category':
category()
elif Choice == 'latest':
latest()
elif Choice == 'search':
search()
pgid = int(input('How Many pages you want to Download: '))
totalImageToDownload = str(24 * pgid)
print('Number of Wallpapers to Download: ' + totalImageToDownload)
for j in range(1, pgid + 1):
downloadPage(j, totalImageToDownload)
if __name__ == '__main__':
main()