簡體   English   中英

以下鏈接,Scrapy web爬蟲框架

[英]Following links, Scrapy web crawler framework

在閱讀了 Scrapy 文檔之后,我仍然沒有發現使用 CrawlSpider 規則和在回調方法上實現我自己的鏈接提取機制之間的區別。

我即將使用后一種方法編寫一個新的 web 爬蟲,但只是因為我在過去的項目中使用規則的經驗很糟糕。 我真的很想知道我在做什么以及為什么。

有人熟悉這個工具嗎?

謝謝你的幫助!

CrawlSpider 繼承 BaseSpider。 它只是添加了提取和跟蹤鏈接的規則。 如果這些規則對您來說不夠靈活 - 使用 BaseSpider:

class USpider(BaseSpider):
    """my spider. """

    start_urls = ['http://www.amazon.com/s/?url=search-alias%3Dapparel&sort=relevance-fs-browse-rank']
    allowed_domains = ['amazon.com']

    def parse(self, response):
        '''Parse main category search page and extract subcategory search link.'''
        self.log('Downloaded category search page.', log.DEBUG)
        if response.meta['depth'] > 5:
            self.log('Categories depth limit reached (recursive links?). Stopping further following.', log.WARNING)

        hxs = HtmlXPathSelector(response)
        subcategories = hxs.select("//div[@id='refinements']/*[starts-with(.,'Department')]/following-sibling::ul[1]/li/a[span[@class='refinementLink']]/@href").extract()
        for subcategory in subcategories:
            subcategorySearchLink = urlparse.urljoin(response.url, subcategorySearchLink)
            yield Request(subcategorySearchLink, callback = self.parseSubcategory)

    def parseSubcategory(self, response):
        '''Parse subcategory search page and extract item links.'''
        hxs = HtmlXPathSelector(response)

        for itemLink in hxs.select('//a[@class="title"]/@href').extract():
            itemLink = urlparse.urljoin(response.url, itemLink)
            self.log('Requesting item page: ' + itemLink, log.DEBUG)
            yield Request(itemLink, callback = self.parseItem)

        try:
            nextPageLink = hxs.select("//a[@id='pagnNextLink']/@href").extract()[0]
            nextPageLink = urlparse.urljoin(response.url, nextPageLink)
            self.log('\nGoing to next search page: ' + nextPageLink + '\n', log.DEBUG)
            yield Request(nextPageLink, callback = self.parseSubcategory)
        except:
            self.log('Whole category parsed: ' + categoryPath, log.DEBUG)

    def parseItem(self, response):
        '''Parse item page and extract product info.'''

        hxs = HtmlXPathSelector(response)
        item = UItem()

        item['brand'] = self.extractText("//div[@class='buying']/span[1]/a[1]", hxs)
        item['title'] = self.extractText("//span[@id='btAsinTitle']", hxs)
        ...

即使 BaseSpider 的 start_urls 對您來說不夠靈活,也請覆蓋start_requests方法。

如果您想要選擇性爬取,例如獲取“下一個”鏈接進行分頁等,最好編寫自己的爬蟲。 但是對於一般的爬取,你應該使用 crawlspider 並使用 Rules & process_links function 過濾掉你不需要遵循的鏈接。

看一下\scrapy\contrib\spiders\crawl.py中的 crawlspider 代碼,它並不太復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM