2012-05-18 2 views
1

В настоящее время я использую scraw's CrawlSpider для поиска конкретной информации в списке из нескольких start_urls. То, что я хотел бы сделать, это прекратить очищать определенный домен start_url, как только я найду информацию, которую я искал, поэтому она не будет ударять по домену и вместо этого просто попадет в другой start_urls.Динамическое добавление доменов в scrapy crawlspider deny_domains list

Есть ли способ сделать это? Я пытался добавить его к deny_domains так:

deniedDomains = [] 
... 
rules = [Rule(SgmlLinkExtractor(..., deny_domains=(etc), ...)] 
... 
def parseURL(self, response): 
    ... 
    self.deniedDomains.append(specificDomain) 

не Добавление данных, кажется, остановить сканирование, но если я начну паук с намеченным specificDomain то зайдет в соответствии с просьбой. Поэтому я предполагаю, что вы не можете изменить список deny_domains после запуска паука?

ответ

0

Что-то в этом роде?

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

class MySpider(CrawlSpider): 
    name = "foo" 
    allowed_domains = ["example.org"] 
    start_urls = ["http://www.example.org/foo/",] 

    rules = (
     Rule(SgmlLinkExtractor(
      allow=('/foo/[^/+]',), 
      deny_domains=('example.com',)), 
     callback='parseURL'), 
     ) 

    def parseURL(self, response): 

     # here the rest of your code 
1

Лучший способ сделать это, чтобы сохранить свой собственный dynamic_deny_domain список в классе Spider:

  • написать простой Downloader Middleware,
  • это простой класс, с одной реализации метода: process_request(request, spider):
  • возвращение IgnoreRequest если запрос находится в вашем списке spider.dynamic_deny_domain, None в противном случае.

Добавьте downloaderMiddleWare к Middleware list in scrapy settings, на первой позиции 'myproject.downloadermiddleware.IgnoreDomainMiddleware': 50,

Если сделать трюк.

Смежные вопросы