मैं एक स्क्रैप वेब स्क्रैपर पर काम कर रहा हूं जो एक प्रारंभिक यूआरएल से सभी आंतरिक लिंक के माध्यम से क्रॉल करता है और केवल scrapy
के साथ बाहरी लिंक एकत्र करता है। हालांकि, मेरी मुख्य समस्या बाहरी लिंक और आंतरिक लिंक वर्गीकृत कर रही है। उदाहरण के लिए, जब मैं link.startswith("http") or link.startswith("ftp") or link.startswith("www")
के साथ बाहरी लिंक को फ़िल्टर करने का प्रयास करता हूं, तो वेबसाइट /about
के बजाय एक पूर्ण पथ (www.my-domain.com/about
) के साथ अपनी वेबसाइट को लिंक करती है, तो यह बाहरी लिंक के रूप में इसे वर्गीकृत करेगी, भले ही यह न हो। निम्नलिखित मेरा कोड है:स्केपर: सभी बाहरी लिंक स्टोर करें और सभी इंटरल लिंक को क्रॉल करें
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 = 'डोमेन' सेट करके आप उन लिंक को निकाल सकते हैं जो किसी दिए गए डोमेन (बाहरी) में नहीं हैं। –
ओह मैन। यह बिल्कुल सही है. बहुत बहुत धन्यवाद। –