使用Scrapy抓取多个域而无需纵横交错

发布于 2021-01-29 16:17:20

我设置了一个CrawlSpider来聚合所有出站链接(start_urls例如,仅从特定深度进行爬网DEPTH_LIMIT = 2)。

class LinkNetworkSpider(CrawlSpider):

    name = "network"
    allowed_domains = ["exampleA.com"]

    start_urls = ["http://www.exampleA.com"]

    rules = (Rule(SgmlLinkExtractor(allow=()), callback='parse_item', follow=True),)

    def parse_start_url(self, response):
        return self.parse_item(response)

    def parse_item(self, response):

        hxs = HtmlXPathSelector(response)
        links = hxs.select('//a/@href').extract()

        outgoing_links = []

        for link in links:
            if ("http://" in link):
                base_url = urlparse(link).hostname
                base_url = base_url.split(':')[0]  # drop ports
                base_url = '.'.join(base_url.split('.')[-2:])  # remove subdomains
                url_hit = sum(1 for i in self.allowed_domains if base_url not in i)
                if url_hit != 0:
                    outgoing_links.append(link)

        if outgoing_links:
            item = LinkNetworkItem()
            item['internal_site'] = response.url
            item['out_links'] = outgoing_links
            return [item]
        else:
            return None

我想将其扩展到多个域(exampleA.com,exampleB.com,exampleC.com
…)。起初,我以为我可以将列表也添加到start_urlsallowed_domains但是我认为这会导致以下问题:

那么,如何在不出现 纵横交错 的问题以及每个网站使用设置的情况下 扩展 更多的蜘蛛呢? __

显示我想要实现的其他图像: y

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我现在没有规则就实现了它。我meta为每个属性都附加了一个属性start_url,然后简单地检查一下自己是否链接属于原始域,并相应地发出新请求。

    因此,请覆盖start_requests

    def start_requests(self):
        return [Request(url, meta={'domain': domain}, callback=self.parse_item) for url, domain in zip(self.start_urls, self.start_domains)]
    

    在随后的解析方法中,我们获取meta属性domain = response.request.meta['domain'],将域与提取的链接进行比较,然后自己发出新请求。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看