Projekt

Obecné

Profil

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>