更轻松地跟踪与Scrapy的链接

时间:2016-08-18 14:32:34

标签: 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 个答案:

答案 0 :(得分:1)

对于绝对网址,您可以使用urlparse.urljoinResponse已经通过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
文档中也有一些例子。