Ich schreibe einen Scrapy Scraper, der CrawlSpider verwendet, um Websites zu crawlen, über ihre internen Links zu gehen und den Inhalt von externen Links (Verknüpfungen mit einer anderen Domäne als der ursprünglichen Domäne) zu scrappen.Dynamische Regeln basierend auf start_urls für Scrapy CrawlSpider?
Ich schaffte das mit 2 Regeln, aber sie basieren auf der Domäne der Website, die gecrawlt wird. Wenn ich das auf mehreren Websites ausführen möchte, stoße ich auf ein Problem, weil ich nicht weiß, auf welcher "start_url" ich gerade bin, sodass ich die Regel nicht ändern kann.
Hier ist, was ich mit so weit kam, ist es für eine Website funktioniert und ich bin nicht sicher, wie es zu einer Liste von Websites gelten:
class HomepagesSpider(CrawlSpider):
name = 'homepages'
homepage = 'http://www.somesite.com'
start_urls = [homepage]
# strip http and www
domain = homepage.replace('http://', '').replace('https://', '').replace('www.', '')
domain = domain[:-1] if domain[-1] == '/' else domain
rules = (
Rule(LinkExtractor(allow_domains=(domain), deny_domains=()), callback='parse_internal', follow=True),
Rule(LinkExtractor(allow_domains=(), deny_domains=(domain)), callback='parse_external', follow=False),
)
def parse_internal(self, response):
# log internal page...
def parse_external(self, response):
# parse external page...
Dies ist wahrscheinlich nur um vorbei die getan werden kann, start_url als Argument beim Aufruf des Scraper, aber ich suche nach einer Möglichkeit, das programmatisch innerhalb des Scraper selbst zu tun.
Irgendwelche Ideen? Danke!
Simon.
Nein, die Inhalte externer Links werden gelöscht. Interne Links werden nicht gekratzt, sondern nur gecrawlt, um alle externen Links auf der Website zu finden. – Simon
@Simon Dann müssen Sie Ihre Selektoren in 'parse_internal' debuggen .. sie könnten falsch sein – Umair
Wie sind sie falsch? Ich denke, Sie haben vielleicht einen Absatz in der Frage verpasst.Ich habe in der Frage geschrieben, dass der Code funktioniert, ich suche nur nach einer Möglichkeit, dies auf mehrere start_urls anzuwenden. – Simon