Pracuję nad skrobaczką, która przeszukuje wszystkie linki wewnętrzne z adresu startowego i zbiera tylko linki zewnętrzne z scrapy
. Jednak moim głównym problemem jest klasyfikowanie zewnętrznych linków i wewnętrznych linków. Na przykład, gdy próbuję odfiltrować linki zewnętrzne za pomocą link.startswith("http") or link.startswith("ftp") or link.startswith("www")
, jeśli witryna łączy swoją własną stronę internetową z bezwzględną ścieżką (www.my-domain.com/about
zamiast /about
), wówczas klasyfikuje ją jako łącze zewnętrzne, nawet jeśli nie jest. Oto mój kod:Złomowanie: przechowuj wszystkie linki zewnętrzne i przeszukuj wszystkie łącza międzymiastowe.
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
Wszelkie sugestie?
Hm .. sugerujesz tworzenie zestawów wewnętrznych linków z LinkExtractor, a dla wszystkich linków sprawdź, czy pasują do linków wewnętrznych, a jeśli nie, to czy są to linki zewnętrzne? –
Niezupełnie, ustawiając 'deny_domains = 'domain'' można wyodrębnić łącza, które nie są w danej domenie (zewnętrzne). –
Och, człowieku. To idealne. Dziękuję bardzo. –