2015-01-16 3 views
0

Я пытаюсь проползать длинным списком веб-сайтов. Некоторые из сайтов в списке start_url переадресовывают (301). Я хочу, чтобы scrapy сканировала перенаправленные веб-сайты из списка start_url, как если бы они также были в списке allowed_domain (а ​​это они не являются). Например, example.com был в моем списке start_url, а список разрешенных доменов и example.com перенаправлялся на foo.com. Я хочу просканировать foo.com.Scrapy Сканирование всех сайтов в start_url, даже если перенаправление

DEBUG: Redirecting (301) to <GET http://www.foo.com/> from <GET http://www.example.com> 

Я пытался динамически добавлять allowed_domains в методе parse_start_url и возвращает объект запроса, так что SCRAPY будет вернуться назад и скрести перенаправлены сайты, когда он находится на списке разрешенных доменов, но я все еще получаю:

DEBUG: Filtered offsite request to 'www.foo.com' 

Вот моя попытка динамически добавлять allowed_domains:

def parse_start_url(self,response): 
    domain = tldextract.extract(str(response.request.url)).registered_domain 
    if domain not in self.allowed_domains: 
     self.allowed_domains.append(domain) 
     return Request = (response.url,callback=self.parse_callback) 
    else: 
     return self.parse_it(response,1) 

Мои другие идеи были попытаться создать функцию в spidermiddleware офф ite.py, который динамически добавляет allowed_domains для перенаправленных веб-сайтов, которые возникли из start_urls, но я не смог заставить это решение работать.

+0

Вы пытаетесь использовать scrapy + selenium webdriver? Здесь есть возможное решение http://stackoverflow.com/questions/27775048/python-selenium-possible-to-cancel-redirect-on-driver-get/27783398#27783398 – aberna

ответ

2

Я понял ответ на свой вопрос.

Я отредактировал промежуточное промежуточное программное обеспечение, чтобы получить обновленный список разрешенных доменов до того, как он будет фильтроваться, и я динамически добавлю список разрешенных доменов в метод parse_start_url.

Я добавил эту функцию, чтобы OffisteMiddleware

def update_regex(self,spider): 
    self.host_regex = self.get_host_regex(spider) 

Я редактировал эту функцию внутри OffsiteMiddleware

def should_follow(self, request, spider): 
    #Custom code to update regex 
    self.update_regex(spider) 

    regex = self.host_regex 
    # hostname can be None for wrong urls (like javascript links) 
    host = urlparse_cached(request).hostname or '' 
    return bool(regex.search(host)) 

Наконец для моего случая использования я добавил этот код на паук

def parse_start_url(self,response): 
    domain = tldextract.extract(str(response.request.url)).registered_domain 
    if domain not in self.allowed_domains: 
     self.allowed_domains.append(domain) 
    return self.parse_it(response,1) 

Этот код добавит перенаправленный домен для любых start_urls, которые перенаправляются и th ru сканирует эти перенаправленные сайты.

+0

Привет 12Ryan12. Большое вам спасибо за это. Это именно то, что я искал. У меня есть пара вопросов, если вы не возражаете: ваша «parse_it» ваша главная функция синтаксического анализа внутри паука? Кроме того, откуда вы называете функцию parse_start_url? Наконец, где вы редактируете OffsiteMiddleware? Заранее спасибо! – Z101

+0

Hi @ 12Ryan12. Поэтому мне удалось найти OffisteMiddleware и удалось внести необходимые корректировки. В то же время я запутался в реализации метода parse_start_url. Также интересно, откуда приходит parse_it (ответ, 1) и что там делает атрибут '1'. Любые рекомендации будут высоко оценены :). – Z101