2014-06-19 39 views
1

我已經設置了一個聚集所有出站鏈接(從start_urls僅通過例如DEPTH_LIMIT = 2爬取一定深度)的CrawlSpider。使用Scrapy抓取多個域名而沒有十字交叉

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_urls以及allowed_domains但在我看來,這將導致以下問題:

  • 會將設置DEPTH_LIMIT應用於每個start_urls/allowed_domain
  • 更重要的是:如果網站連接,蜘蛛會從exampleA.com跳轉到exampleB.com,因爲它們都在allowed_domains中?我需要避免這種縱橫交錯的情況,因爲我後來想要統計每個站點的出站鏈接,以獲取有關這些網站之間關係的信息!

所以,我怎麼能規模更沒有運行到縱橫交錯的問題,並使用每個網站的設置蜘蛛?

其他圖像顯示我想實現什麼: scrapy

回答

2

我現在已經實現了它沒有規則。我給每個start_url添加了一個meta屬性,然後簡單地檢查自己鏈接是否屬於原始域,並相應地發出新的請求。

因此,覆蓋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'],比較所提取的鏈接域名和送出自己新的要求。

1

你可能需要不斷的履帶已經訪問過的URL的數據結構(例如一個HashMap)。然後,只需要在訪問它們時向hashmap添加URL,如果它們已經在hashmap中(而這意味着您已經訪問過它們),則不會訪問URL。這樣做可能會有更復雜的方法,這會給你更大的性能,但這些也會更難實施。

+0

那麼在'scrapy'中,如果你傳遞了一個start_url和一個allowed_domain,就已經實現了。我想知道可以輕鬆擴展它。 – bioslime