DatasetCrawler » Historie » Verze 11
Petr Hlaváč, 2020-05-27 14:56
1 | 1 | Petr Hlaváč | h1. DatasetCrawler |
---|---|---|---|
2 | |||
3 | 3 | Petr Hlaváč | 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*. |
4 | 1 | Petr Hlaváč | |
5 | 2 | Petr Hlaváč | Je velmi žádoucí aby crawler pro stažení souboru používal funkci *basic_crawler_functions.download_file_from_url("url_souboru", "jmeno_datasetu")*. |
6 | 4 | Petr Hlaváč | 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í. |
7 | 1 | Petr Hlaváč | |
8 | h2. Generovaný crawler |
||
9 | |||
10 | Při použití skriptu *PrepareNewDataset.py* vznikne následující kostra pro doplnění funkčnosti. |
||
11 | |||
12 | <pre> |
||
13 | # Path to crawled data |
||
14 | CRAWLED_DATA_PATH = "CrawledData/" |
||
15 | |||
16 | |||
17 | def crawl(config): |
||
18 | """ |
||
19 | Implement crawl method that downloads new data to path_for_files |
||
20 | For keeping the project structure |
||
21 | url , regex, and dataset_name from config |
||
22 | You can use already implemented functions from Utilities/Crawler/BasicCrawlerFunctions.py |
||
23 | |||
24 | Args: |
||
25 | config: loaded configuration file of dataset |
||
26 | """ |
||
27 | dataset_name = config["dataset-name"] |
||
28 | url = config['url'] |
||
29 | regex = config['regex'] |
||
30 | path_for_files = CRAWLED_DATA_PATH + dataset_name + '/' |
||
31 | print("You must implements Crawl method first!") |
||
32 | |||
33 | </pre> |
||
34 | 5 | Petr Hlaváč | |
35 | h2. Vzorově implementovaný crawler |
||
36 | 7 | Petr Hlaváč | |
37 | 6 | Petr Hlaváč | Pro ukázku byl zvonel crawler pro dataset koloběžek. Je zde využito hlavně funkcí z *Utilities.Crawler.basic_crawler_functions*. |
38 | |||
39 | 8 | Petr Hlaváč | # Crawler si stáhne stránku specifikovanou v konfiguračním souboru jako root (https://openstore.zcu.cz/). |
40 | # Vyparsuje všechny odkazy na stránce |
||
41 | # Vyfiltruje pouze požadované ("^OD_ZCU") a ty ze kterých již byla stažená data. |
||
42 | 9 | Petr Hlaváč | # 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 |
43 | 8 | Petr Hlaváč | # Linky, které prošli filtrem odkazují na soubory s daty. |
44 | 11 | Petr Hlaváč | # Vyřadíme odkazy s daty, které už máme stažené. |
45 | # Data z odkazů 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. |
||
46 | 8 | Petr Hlaváč | # 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)* |
47 | |||
48 | |||
49 | 5 | Petr Hlaváč | |
50 | <pre> |
||
51 | from Utilities import folder_processor |
||
52 | from Utilities.Crawler import basic_crawler_functions |
||
53 | |||
54 | # Path to crawled data |
||
55 | CRAWLED_DATA_PATH = "CrawledData/" |
||
56 | |||
57 | |||
58 | def crawl(config): |
||
59 | """ |
||
60 | Implement crawl method that downloads new data to path_for_files |
||
61 | For keeping the project structure |
||
62 | url , regex, and dataset_name from config |
||
63 | You can use already implemented functions from Utilities/Crawler/basic_crawler_functions.py |
||
64 | |||
65 | Args: |
||
66 | config: loaded configuration file of dataset |
||
67 | """ |
||
68 | dataset_name = config["dataset-name"] |
||
69 | url = config['url'] |
||
70 | regex = config['regex'] |
||
71 | path_for_files = CRAWLED_DATA_PATH + dataset_name + '/' |
||
72 | |||
73 | first_level_links = basic_crawler_functions.get_all_links(url) |
||
74 | filtered_first_level_links = basic_crawler_functions.filter_links(first_level_links, "^OD_ZCU") |
||
75 | absolute_first_level_links = basic_crawler_functions.create_absolute_links(filtered_first_level_links, url) |
||
76 | |||
77 | files = [] |
||
78 | |||
79 | for link in absolute_first_level_links: |
||
80 | second_level_links = basic_crawler_functions.get_all_links(link) |
||
81 | filtered_second_level_links = basic_crawler_functions.filter_links(second_level_links, regex) |
||
82 | absolute_second_level_links = basic_crawler_functions.create_absolute_links(filtered_second_level_links, link) |
||
83 | 1 | Petr Hlaváč | |
84 | 10 | Petr Hlaváč | for file_link in absolute_second_level_links: |
85 | 1 | Petr Hlaváč | files.append(file_link) |
86 | |||
87 | 10 | Petr Hlaváč | files = basic_crawler_functions.remove_downloaded_links(files, dataset_name) |
88 | |||
89 | 5 | Petr Hlaváč | for file in files: |
90 | basic_crawler_functions.download_file_from_url(file, dataset_name) |
||
91 | 1 | Petr Hlaváč | |
92 | 5 | Petr Hlaváč | folder_processor.unzip_all_csv_zip_files_in_folder(path_for_files) |
93 | 10 | Petr Hlaváč | |
94 | 5 | Petr Hlaváč | |
95 | </pre> |