#!/usr/bin/python3 import requests import urllib.request import urllib3.exceptions import sys import os import argparse import time parser = argparse.ArgumentParser(add_help=True) parser.add_argument('-js','-JS',"--Javascript",'--javascript', default=False, action='store_true', dest='usingJavascript', help='Enables the user of a webdriver to scrape funnies' ) parser.add_argument('--amount','-a', default=0, dest='amount', action="store", help="the amount of funnies you'd like to download per tag", type=int ) parser.add_argument('tags', nargs='+', type=str, help='Provides tags to be check for funny downloading' ) args = parser.parse_args() if not args.usingJavascript: from bs4 import BeautifulSoup print("using html mode...") for tags in args.tags: URL = requests.get('https://ifunny.co/tags/' + tags + '?filter=video') webpage = BeautifulSoup(URL.content, 'html.parser') videos = webpage.findAll('video') epoch = len([item for item in os.listdir('/home/'+ os.environ['USER'] + '/Videos/unsorted/')]) if args.amount > 0: videos = video[:arg.amount] for video in videos: epoch = epoch + 1 print("saving " + video['data-src'] + " as " + str(epoch) + '.mp4') urllib.request.urlretrieve(video['data-src'], '/home/' + os.environ['USER'] + '/Videos/unsorted/' + str(epoch) + '.mp4') elif args.usingJavascript: from selenium import webdriver print("using JS mode...") try: from selenium.webdriver.firefox.options import Options firefox_options = Options() firefox_options.add_argument("--headless") driver = webdriver.Firefox(options=firefox_options) except: try: from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") driver = webdriver.Chrome(options=chrome_options) except: try: from selenium.webdriver.firefox.options import Options firefox_options = Options() firefox_options.add_argument("--headless") driver = webdriver.Firefox(executable_path=GeckoDriverManager().install(), options=firefox_options) except: try: from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless") driver = webdriver.Chrome(ChromeDriverManager(chrome_type=ChromeType.CHROMIUM).install(), options=chrome_options) except: print("Could not find webdriver!") print("You'll have to manually install a webdriver to your path") print("If you are using GNU/Linux, it is likely that you can install from your standard repos. Debian labels their chromium driver chromium-driver. If you wish to use an ungoogled version of chromium (as to reduce possiblity of spying), you can find a link to that here: https://github.com/Eloston/ungoogled-chromium#downloads. On Debian (or debian likes such as Ubuntu or Devuan), you may then run apt install ungoogled-chromium-driver and this will no longer fail.") sys.exit() for tags in args.tags: for tries in range(100): try: driver.get('https://ifunny.co/tags/' + tags + '?filter=video') except: if tries < 100 - 1: print("Rate Limited! Sleeping for " + str(tries*1.5) + " seconds!") time.sleep(tries*1.5) continue break if args.amount > 0: isTimesScrolled = 0 oughtTimeScrolled = (args.amount/10) + 1 while isTimesScrolled < int(oughtTimeScrolled): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") isTimesScrolled = isTimesScrolled + 1 time.sleep(3) videos = driver.find_elements_by_tag_name("video") if args.amount > 0: videos = videos[:args.amount] epoch = len([item for item in os.listdir('/home/'+ os.environ['USER'] + '/Videos/unsorted/')]) for video in videos: epoch = epoch + 1 print("saving " + video.get_attribute("data-src") + " as " + str(epoch) + '.mp4') for tries in range(100): try: urllib.request.urlretrieve(video.get_attribute("data-src"), '/home/' + os.environ['USER'] + '/Videos/unsorted/' + str(epoch) + '.mp4') except: if tries < 100 - 1: print("Rate Limited! Sleeping for " + str(tries*1.5) + " seconds!") time.sleep(tries*1.5) continue break driver.quit() else: print("Neither Javascript or HTML was given!") sys.exit(1)