我一直在研究scrapy網絡抓取工具,它從一個起始網址抓取所有內部鏈接,僅收集與scrapy
的外部鏈接。但是,我的主要問題是分類外部鏈接和內部鏈接。例如,當我嘗試用link.startswith("http") or link.startswith("ftp") or link.startswith("www")
過濾掉外部鏈接時,如果網站使用絕對路徑(www.my-domain.com/about
而不是)鏈接其自己的網站,那麼即使它不是外部鏈接,它也會將其歸類爲外部鏈接。以下是我的代碼:Scrapy:存儲所有外部鏈接並抓取所有內部鏈接
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
有什麼建議嗎?
嗯..你是否建議製作一套LinkExtractor的內部鏈接,並且對於所有鏈接,檢查它們是否匹配內部鏈接,如果不匹配,那麼它們是外部鏈接? –
不完全是,通過設置'deny_domains ='domain'',您可以提取不在給定域(外部)中的鏈接。 –
哦,夥計。那很完美。非常感謝。 –