2017-10-10 230 views
0

我想根據網頁的sitemap.xml創建一個抓取網址的蜘蛛。所以我沒有start_urls。我想確定使用sitemap.xml刮掉哪些網址。如何在scrapy蜘蛛中使用url的站點地圖?

我曾考慮添加方法_parse_sitemap並使用requestslxml解析它,但它可能是一種矯枉過正。

是否有一些內置方法可以獲得<loc>標籤中的所有url?

我迄今所做的:

蜘蛛得到一個URL和meta = {'sitemap':True}如此分析方法知道它必須調用基於從地圖網址有哪些_parse_sitemap小號yield對象Request

import scrapy 
from scrapy import Request 


class MainSpider(scrapy.Spider): 
    name = 'main_spider' 
    allowed_domains = ['www.example.com'] 
    sitemap = 'www.example.com/sitemap.xml' 
    start_urls = [sitemap] 

    def start_requests(self): 
     yield Request(url=self.sitemap,meta={'sitemap':True}) 

    def parse(self, response): 
     if response.meta.get('sitemap'): 
      self._parse_sitemap(response) 
     else: 
      # parse normal url 

    def _parse_sitemap(self, response): 
     # how to get urls? 
     urls = [] 
     for url in urls: 
      yield Request(url=url,callback=self.parse) 

這只是一個xml所以我覺得我不應該使用SitemapSpider。你有什麼建議?正如你可以看到我不知道如何解析urls裏面的_parse_sitemap蜘蛛。

+1

爲什麼你認爲你不應該使用SitemapSpider,因爲你只有一個文件?您的蜘蛛可能非常簡單,就像來自文檔的第一個示例:https://doc.scrapy.org/en/latest/topics/spiders.html#sitemapspider-examples – elacuesta

+0

您可以簡單地使用SgmlLinkExtractor.It將給所有來自頁面的鏈接。 使用下面從scrapy.contrib.spiders從scrapy.contrib.linkextractors.sgml進口SgmlLinkExtractor 進口 導入CrawlSpider,規則 添加以下行類,並指定你的回調函數,它將性反應的所有URL 規則= (Rule(SgmlLinkExtractor(),callback ='parse_url',follow = False)) –

回答

0

您可以簡單地使用SgmlLinkExtractor。它會給出頁面上的所有鏈接。下面進口

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.spiders import CrawlSpider, Rule 

使用添加以下行類,並指定你的回調函數,它將性反應的所有URL

rules = (Rule(SgmlLinkExtractor(), callback='_parse_sitemap', follow=False),) 
0

由於SgmlLinkExtractor現在已經廢棄,LxmlLinkExtractor應該被使用。有關它們之間的區別的更多信息,請參閱here