Ich habe an einem Scrapy Web Scraper gearbeitet, der alle internen Links von einer Start-URL durchsucht und nur externe Links mit scrapy
erfasst. Mein Hauptproblem ist jedoch die Klassifizierung der externen Links und internen Links. Zum Beispiel, wenn ich versuche, externe Links mit link.startswith("http") or link.startswith("ftp") or link.startswith("www")
herauszufiltern, wenn die Website ihre eigene Website mit einem absoluten Pfad verbindet (www.my-domain.com/about
statt /about
) dann wird es es als den externen Link klassifizieren, auch wenn es nicht ist. Das Folgende ist mein Code:Scrapy: alle externen Links speichern und alle internen Links crawlen
import scrapy
from lab_relationship.items import Links
class WebSpider(scrapy.Spider):
name = "web"
allowed_domains = ["my-domain.com"]
start_urls = (
'www.my-domain.com',
)
def parse(self, response):
""" finds all external links"""
items = []
for link in set(response.xpath('//a/@href').extract()):
item = Links()
if len(link) > 1:
if link.startswith("/") or link.startswith("."):
# internal link
url = response.urljoin(link)
item['internal'] = url
#yield scrapy.Request(url, self.parse)
elif link.startswith("http") or link.startswith("ftp") or link.startswith("www"):
# external link
item['external'] = link
else:
# misc. links: mailto, id (#)
item['misc'] = link
items.append(item)
return items
Irgendwelche Vorschläge?
Hm .. schlagen Sie vor, eine Reihe von internen Links mit LinkExtractor zu erstellen, und für alle Links zu überprüfen, ob sie den internen Links entsprechen, und wenn nein, sind sie externe Links? –
Nicht genau, indem Sie 'deny_domains = 'Domäne' setzen, können Sie Links extrahieren, die sich nicht in einer bestimmten Domäne (extern) befinden. –
Oh Mann. Das ist perfekt. Ich danke dir sehr. –