Ho lavorato a un raschiatore raschiato che striscia attraverso tutti i collegamenti interni da un URL di avvio e raccoglie solo collegamenti esterni con scrapy
. Tuttavia, il mio problema principale è la classificazione dei collegamenti esterni e dei collegamenti interni. Ad esempio, quando provo a filtrare i collegamenti esterni con link.startswith("http") or link.startswith("ftp") or link.startswith("www")
, se il sito Web collega il proprio sito Web con un percorso assoluto (www.my-domain.com/about
anziché /about
), lo classificherà come collegamento esterno anche se non lo è. Quello che segue è il mio codice:Scrapy: archivia tutti i collegamenti esterni e scansiona tutti i collegamenti interni
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
Qualche suggerimento?
Hm .. stai suggerendo di creare una serie di collegamenti interni con LinkExtractor e per tutti i link, controlla se corrispondono ai collegamenti interni e, in caso negativo, si tratta di collegamenti esterni? –
Non esattamente, impostando 'deny_domains = 'dominio'' puoi estrarre link che non si trovano in un dato dominio (esterno). –
Oh uomo. È perfetto. Grazie mille. –