2016-08-18 73 views
0

我有一個scrapy蜘蛛下面的代碼:更簡單的方法來跟蹤鏈接與Scrapy

class ContactSpider(Spider): 
    name = "contact" 
    # allowed_domains = ["http://www.domain.com/"] 
    start_urls = [ 

     "http://web.domain.com/DECORATION" 
    ] 
    BASE_URL = "http://web.domain.com" 

    def parse(self, response): 
     links = response.selector.xpath('//*[contains(@class,"MAIN")]/a/@href').extract() 
     for link in links: 
      absolute_url = self.BASE_URL + link 
      yield Request(absolute_url, headers= headers, callback=self.second) 

我很驚訝沒有在scrapy一個簡單的方法來跟蹤鏈接,而不是構建每個absolute_url。有沒有更好的方法來做到這一點?

回答

1

對於絕對網址,您可以使用urlparse.urljoin,Response已通過response.urljoin(link)有一個快捷方式。所以,你的代碼很容易被替代:

def parse(self, response): 
    links = response.selector.xpath('//*[contains(@class,"MAIN")]/a/@href').extract() 
    for link in links: 
     yield Request(response.urljoin(link), headers=headers, callback=self.second) 

您還可以使用scrapy LinkExtractors根據一定的規則,其提取環節和管理所有的自動連接。

from scrapy.linkextractors import LinkExtractor 
def parse(self, response): 
    le = LinkExtractor(restrict_xpaths='//*[contains(@class,"MAIN")]/a/@href') 
    links = le.extract_links(response) 
    for link in links: 
     yield Request(link.url, headers= headers, callback=self.second) 

關於更多自動爬行經驗 - scrapy具有CrawlSpider它採用一套規則來提取,並按照每個頁面上的鏈接。你可以在這裏閱讀更多:http://doc.scrapy.org/en/latest/topics/spiders.html#crawlspider
該文檔也有一些它的例子。

+0

我建議先提一提'CrawlSpider':我相信這是這類用例的開箱即用的蜘蛛類。 –

+0

非常感謝! – user61629