2014-01-24 41 views
1

我爬行大量的網址,並想知道是否有可能讓scrapy不用'meta name =「robots」content =「noindex」'解析頁面? 看看這裏列出的拒絕規則http://doc.scrapy.org/en/latest/topics/link-extractors.html它看起來像拒絕規則只適用於URL。你可以讓scrapy忽略xpath嗎?Scrapy忽略noindex

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

from wallspider.items import Website 


class Spider(CrawlSpider): 
    name = "browsetest" 
    allowed_domains = ["www.mydomain.com"] 
    start_urls = ["http://www.mydomain.com",] 

    rules = (
     Rule(SgmlLinkExtractor(allow=('/browse/')), callback="parse_items", follow= True), 
     Rule(SgmlLinkExtractor(allow=(),unique=True,deny=('/[1-9]$', '(bti=)[1-9]+(?:\.[1-9]*)?', '(sort_by=)[a-zA-Z]', '(sort_by=)[1-9]+(?:\.[1-9]*)?', '(ic=32_)[1-9]+(?:\.[1-9]*)?', '(ic=60_)[0-9]+(?:\.[0-9]*)?', '(search_sort=)[1-9]+(?:\.[1-9]*)?', 'browse-ng.do\?', '/page/', '/ip/', 'out\+value', 'fn=', 'customer_rating', 'special_offers', 'search_sort=&', 'facet='))), 
    ) 

    def parse_items(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//html') 
     items = [] 

     for site in sites: 
      item = Website() 
      item['url'] = response.url 
      item['canonical'] = site.xpath('//head/link[@rel="canonical"]/@href').extract() 
      item['robots'] = site.select('//meta[@name="robots"]/@content').extract() 
      items.append(item) 

     return items 
+1

你想跳過檢索這些頁面?如果是這樣,那是不可能的,因爲爲了查找元機器人,您必須檢索該頁面。 – Rolando

+0

對不起,我改寫了我的問題。是否有可能讓它解析包含'meta name =「robots」content =「noindex」'的網址? –

+0

我可以否認xpath嗎? –

回答

4

不幸的是,CrawlSpider沒有提供您想要做的選項。儘管如此,你可以重寫它的方法來實現它。

嘗試增加這個方法將你的蜘蛛:

def _response_downloaded(self, response): 
     # Check whether this page contains the meta noindex in order to skip the processing. 
     sel = Selector(response) 
     if sel.xpath('//meta[@content="noindex"]'): 
      return 

     return super(Spider, self)._response_downloaded(response) 

每當文件是不夠的,你可以查看源代碼,看看有什麼可以改變,在哪裏,只是要小心你使用的是什麼版本。您可以瀏覽github上的最新源代碼:https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/spiders/crawl.py#L61

但更好的方法是檢查系統中的源代碼。如果您正在使用IPython,可以使用??運算符輕鬆完成。

+0

關於源代碼的很好的提示 - 我是python和編程的新手,你的幫助對我有巨大的幫助。 –

+0

對於另一個爬蟲,只有當元內容包含noindex時,我將如何去解析? '返回超級(蜘蛛,自我).parse_items(響應)'? –

+0

@Murdrae是的,把'return super(...')移到if塊中。 – Rolando