Guest User

mascraper

a guest
Oct 13th, 2021
963
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.20 KB | None | 0 0
  1. import argparse
  2. import random
  3. import logging
  4. import os
  5. import sys
  6. import shutil
  7.  
  8. os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
  9.  
  10. import nsfw_model
  11. import vscoscrape
  12.  
  13.  
  14. def calc_nsfw_index(classification: dict) -> float:
  15.     """ {'drawings': 0.04, 'hentai': 0.03, 'neutral': 0.47, 'porn': 0.42, 'sexy': 0.02}  ->  0.48 """
  16.     return sum((classification['hentai'], classification['porn'], classification['sexy']))
  17.  
  18.  
  19. def parse_profile_name(profile: str) -> str:
  20.     if 'vsco.co/' not in profile:
  21.         return profile
  22.     return profile.partition('vsco.co/')[2].partition('/')[0]
  23.  
  24.  
  25. def is_image(filename: str) -> bool:
  26.     return filename.lower().endswith(('.png', '.jpg', '.jpeg'))
  27.  
  28.  
  29. def get_vsco_file_name(file_info: list) -> str:
  30.     return file_info[1] + '.' + file_info[0].rpartition('.')[2]
  31.  
  32.  
  33. def analyze_profile(model, profile: str, sample_proportion: float = 0.2, floor: float = 0.75, maxposts: int = 200):
  34.     started_dir = os.getcwd()
  35.     try:
  36.         scraper = vscoscrape.Scraper(parse_profile_name(profile))
  37.         scraper.getImageList()
  38.         logging.info(f"Analyzing username: {scraper.username}")
  39.         images = list(filter(lambda info: is_image(info[0]), scraper.imagelist))
  40.         if len(images) == 0:
  41.             logging.warning('No images found')
  42.         if len(images) < maxposts:
  43.             for i, image_info in enumerate(random.sample(images, int(len(images) * sample_proportion))):
  44.                 scraper.download_img_normal(image_info)
  45.                 classification = list(nsfw_model.classify(model,
  46.                                                       f"{scraper.path}/{get_vsco_file_name(image_info)}").values())[0]
  47.                 nsfw_index = calc_nsfw_index(classification)
  48.                 logging.debug(f"NSFW index: {nsfw_index}, filename: {get_vsco_file_name(image_info)}")
  49.                 if nsfw_index > floor:
  50.                     logging.info(f"NSFW FOUND, index: {nsfw_index}, "
  51.                                  f"pics scanned: {i + 1}, "
  52.                                  f"filename: {get_vsco_file_name(image_info)}")
  53.                     scraper.getImages()
  54.                     return
  55.             else:
  56.                 logging.info(f"NO NSFW FOUND, "
  57.                             f"pics scanned: {int(len(images) * sample_proportion)}")
  58.                 if os.getcwd() != started_dir:
  59.                     directory = os.getcwd()
  60.                 os.chdir(started_dir)
  61.                 shutil.rmtree(directory, ignore_errors=True)
  62.         else:
  63.             logging.info(f"TOO MUCH POSTS. MAX is {maxposts}")
  64.             if os.getcwd() != started_dir:
  65.                     directory = os.getcwd()
  66.             os.chdir(started_dir)
  67.             shutil.rmtree(directory, ignore_errors=True)
  68.     except Exception as e:
  69.         logging.error(e)
  70.         raise
  71.     finally:
  72.         if os.getcwd() != started_dir:
  73.             os.chdir(started_dir)
  74.  
  75.  
  76. def parse_args(args: list):
  77.     parser = argparse.ArgumentParser()
  78.     parser.add_argument('floor', nargs='?', type=float, default=0.8,
  79.                         help='РїРѕСЂРѕРі для nsfw_index (подробнее РІ README.txt)')
  80.     parser.add_argument('sample', nargs='?', type=float, default=0.2,
  81.                         help='процент РїРёРєС‡, которые Р±СѓРґСѓС‚ предскачаны (подробнее РІ README.txt)')
  82.     parser.add_argument('maxposts', nargs='?', type=int, default=200,
  83.                         help='max post num')
  84.     return parser.parse_args(args)
  85.  
  86.  
  87. if __name__ == '__main__':
  88.     sys.stderr = sys.stdout
  89.  
  90.     logging.basicConfig(level=logging.INFO,
  91.                         format='%(asctime)s.%(msecs)d %(levelname)s %(module)s - %(funcName)s: %(message)s',
  92.                         datefmt='%H:%M:%S')
  93.  
  94.     parsed_args = parse_args(sys.argv[1:])
  95.  
  96.     model = nsfw_model.load_model('./model_mobilenet_v2_140_224.h5')
  97.  
  98.     while True:
  99.         link = input('Enter link:\n')
  100.         try:
  101.             analyze_profile(model, link, parsed_args.sample, parsed_args.floor, parsed_args.maxposts)
  102.         except Exception as e:
  103.             logging.error(e)
  104.  
Add Comment
Please, Sign In to add comment