Tôi đã làm việc trên một trình thu thập dữ liệu web thu thập thông tin qua tất cả các liên kết nội bộ từ url bắt đầu và chỉ thu thập các liên kết bên ngoài với scrapy
. Tuy nhiên, vấn đề chính của tôi là phân loại các liên kết bên ngoài và các liên kết nội bộ. Ví dụ: khi tôi cố gắng lọc ra các liên kết bên ngoài với link.startswith("http") or link.startswith("ftp") or link.startswith("www")
, nếu trang web liên kết trang web của riêng nó với đường dẫn tuyệt đối (www.my-domain.com/about
thay vì /about
) thì nó sẽ phân loại nó thành liên kết bên ngoài ngay cả khi không. Sau đây là mã của tôi:Phế liệu: lưu trữ tất cả các liên kết bên ngoài và thu thập thông tin tất cả các liên kết nội bộ
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
Mọi đề xuất?
Hm .. bạn đang gợi ý tạo một tập hợp các liên kết nội bộ với LinkExtractor và cho tất cả các liên kết, hãy kiểm tra xem chúng có khớp với các liên kết nội bộ hay không và nếu không, chúng là các liên kết bên ngoài? –
Không chính xác, bằng cách đặt 'deny_domains = 'domain'' bạn có thể trích xuất các liên kết không nằm trong một miền cụ thể (bên ngoài). –
Oh man. Đó là hoàn hảo. Cảm ơn bạn rất nhiều. –