DatasetCrawler » Historie » Revize 10
Revize 9 (Petr Hlaváč, 2020-05-27 08:58) → Revize 10/11 (Petr Hlaváč, 2020-05-27 14:55)
h1. DatasetCrawler Složka obsahuje implementace crawleru pro jednotlivé datasety. Crawlery jsou dynamicky importovány je tedy proto nutné dodržet pojemnování *"dataset-name"_crawler.py*. Je velmi žádoucí aby crawler pro stažení souboru používal funkci *basic_crawler_functions.download_file_from_url("url_souboru", "jmeno_datasetu")*. Ta totiž ukládá do databáze zmínku o tom, které soubory byly již staženy aby nedocházelo k duplicitám nebo zbytečnému stahování. h2. Generovaný crawler Při použití skriptu *PrepareNewDataset.py* vznikne následující kostra pro doplnění funkčnosti. <pre> # Path to crawled data CRAWLED_DATA_PATH = "CrawledData/" def crawl(config): """ Implement crawl method that downloads new data to path_for_files For keeping the project structure url , regex, and dataset_name from config You can use already implemented functions from Utilities/Crawler/BasicCrawlerFunctions.py Args: config: loaded configuration file of dataset """ dataset_name = config["dataset-name"] url = config['url'] regex = config['regex'] path_for_files = CRAWLED_DATA_PATH + dataset_name + '/' print("You must implements Crawl method first!") </pre> h2. Vzorově implementovaný crawler Pro ukázku byl zvonel crawler pro dataset koloběžek. Je zde využito hlavně funkcí z *Utilities.Crawler.basic_crawler_functions*. # Crawler si stáhne stránku specifikovanou v konfiguračním souboru jako root (https://openstore.zcu.cz/). # Vyparsuje všechny odkazy na stránce # Vyfiltruje pouze požadované ("^OD_ZCU") a ty ze kterých již byla stažená data. # Následně projde všechny odkazy první urovně stejným způsobem získá všechny odkazy a vyfiltruje je podle regexu specifikovaného v konfiguračním souboru # Linky, které prošli filtrem odkazují na soubory s daty. # Data stáhneme pomocí funkce *basic_crawler_functions.download_file_from_url("url_souboru", "jmeno_datasetu")*, který zajistí stažení souboru na správné místo a uložení jeho linku do databáze. # Jelikož jsou data data na stránce ve formátu ".zip" ještě projdeme znovu celou složku soubory rozbalíme a zipy smažeme funkcí *folder_processor.unzip_all_csv_zip_files_in_folder(path_for_files)* <pre> from Utilities import folder_processor from Utilities.Crawler import basic_crawler_functions # Path to crawled data CRAWLED_DATA_PATH = "CrawledData/" def crawl(config): """ Implement crawl method that downloads new data to path_for_files For keeping the project structure url , regex, and dataset_name from config You can use already implemented functions from Utilities/Crawler/basic_crawler_functions.py Args: config: loaded configuration file of dataset """ dataset_name = config["dataset-name"] url = config['url'] regex = config['regex'] path_for_files = CRAWLED_DATA_PATH + dataset_name + '/' first_level_links = basic_crawler_functions.get_all_links(url) filtered_first_level_links = basic_crawler_functions.filter_links(first_level_links, "^OD_ZCU") absolute_first_level_links = basic_crawler_functions.create_absolute_links(filtered_first_level_links, url) files = [] for link in absolute_first_level_links: second_level_links = basic_crawler_functions.get_all_links(link) filtered_second_level_links = basic_crawler_functions.filter_links(second_level_links, regex) absolute_second_level_links = basic_crawler_functions.create_absolute_links(filtered_second_level_links, link) final_links = basic_crawler_functions.remove_downloaded_links(absolute_second_level_links, dataset_name) for file_link in absolute_second_level_links: final_links: files.append(file_link) files = basic_crawler_functions.remove_downloaded_links(files, dataset_name) for file in files: basic_crawler_functions.download_file_from_url(file, dataset_name) folder_processor.unzip_all_csv_zip_files_in_folder(path_for_files) </pre>