-
Notifications
You must be signed in to change notification settings - Fork 4
/
crawler.py
64 lines (58 loc) · 2.6 KB
/
crawler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Hier importieren wir die benötigten Softwarebibliotheken.
from resiliparse.extract.html2text import extract_plain_text
from scrapy import Spider, Request
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor
from scrapy.http.response.html import HtmlResponse
class SchoolSpider(Spider):
# Gib hier dem Crawler einen eindeutigen Name,
# der beschreibt, was du crawlst.
name = "school"
start_urls = [
# Gib hier mindestens eine (oder mehrere) URLs an,
# bei denen der Crawler anfangen soll,
# Seiten zu downloaden.
"https://wilhelm-gym.de/",
]
link_extractor = LxmlLinkExtractor(
# Beschränke den Crawler, nur Links zu verfolgen,
# die auf eine der gelisteten Domains verweisen.
allow_domains=["wilhelm-gym.de"],
)
custom_settings = {
# Identifiziere den Crawler gegenüber den gecrawlten Seiten.
"USER_AGENT": "Sommercamp (https://uni-jena.de)",
# Der Crawler soll nur Seiten crawlen, die das auch erlauben.
"ROBOTSTXT_OBEY": True,
# Frage zu jeder Zeit höchstens 4 Webseiten gleichzeitig an.
"CONCURRENT_REQUESTS": 4,
# Verlangsame den Crawler, wenn Webseiten angeben,
# dass sie zu oft angefragt werden.
"AUTOTHROTTLE_ENABLED": True,
"AUTOTHROTTLE_TARGET_CONCURRENCY": 1,
# Frage nicht zwei mal die selbe Seite an.
"HTTPCACHE_ENABLED": True,
}
def parse(self, response):
if not isinstance(response, HtmlResponse):
# Die Webseite ist keine HTML-Webseite, enthält also keinen Text.
return
# Speichere die Webseite als ein Dokument in unserer Dokumentensammlung.
yield {
# Eine eindeutige Identifikations-Nummer für das Dokument.
"docno": str(hash(response.url)),
# Die URL der Webseite.
"url": response.url,
# Der Titel der Webseite aus dem <title> Tag im HTML-Code.
"title": response.css("title::text").get(),
# Der Text der Webseite.
# Um den Hauptinhalt zu extrahieren, benutzen wir
# eine externe Bibliothek.
"text": extract_plain_text(response.text, main_content=True),
}
# Finde alle Links auf der aktuell betrachteten Webseite.
for link in self.link_extractor.extract_links(response):
if link.text == "":
# Ignoriere Links ohne Linktext, z.B. bei Bildern.
continue
# Für jeden gefundenen Link, stelle eine Anfrage zum Crawling.
yield Request(link.url, callback=self.parse)