2016-02-10 3 views
2

Я использую Scrapy CrawlSpider для сканирования веб-сайтов и обработки их содержимого на странице. Для этого я использую Scrapy Docs Crawlspider Example.Scrapy CrawlSpider parse_item для ответа перенаправления 302

Отдельная страница на ссылках принимает параметр target через запрос GET (скажем http://www.example.com?target=x) и перенаправляет (302), если значение является ошибочным. При получении этого ответа 302 HTTP, scrapy следует за перенаправлением, но не обрабатывает response в методе parse_item, как и предполагалось мной.

Я столкнулся с несколькими решениями, предлагающими meta/dont_redirect/http_status_list, но ни один из них не вступает в силу.

Пожалуйста, предложите, как я могу разобрать ответ перенаправления 302, без/до следующего в перенаправленном местоположении 302.

Scrapy версия: 0.24.6

+0

Во-первых, вы должны использовать Scrapy v1 + и с 'мета = {«dont_redirect»: Правда } 'должен остановить« RedirectMiddleware », который включен по умолчанию, перенаправляет перенаправление на коды статуса переадресации, такие как 302. Если это не помогает, нам нужна дополнительная информация. – Granitosaurus

+0

@ Granitosaurus Я знаю, версия 0.24 довольно старая, но я работаю над старой базой, которая не может быть немедленно перенесена в v1.0, поэтому придется иметь дело только с этим, более того, где именно должно быть это 'meta = {'dont_redirect': True } 'быть поставлен? Простое определение его в определении класса не помогает. – bawejakunal

+0

oh нет, я опубликовал подробный ответ, как включить это :) – Granitosaurus

ответ

2

Чтобы отключить переадресацию, вы должны добавить meta={'dont_redirect': True) своим Поддавшись scrapy.Request с.
так что ваш паук должен выглядеть примерно так:

import scrapy 
class MySpider(scrapy.Spider): 
    name = 'myspider' 
    start_urls = ['http://example.com',] 
    def start_requests(self): 
     for url in self.start_urls: 
      yield scrapy.Request(url, meta={'dont_redirect':True}) 

Что здесь происходит, что SCRAPY имеет загрузчик по умолчанию промежуточного программного обеспечения с названием RedirectMiddleware которая включена по умолчанию и обрабатывает все редиректы, поставляя эту мету аргумента вы рассказываете это промежуточное ПО, чтобы не выполнять эту работу для этого конкретного запроса.

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

REDIRECTS_ENABLED = False 

к вашему settings.py в Scrapy проекте.

Существует блестящая иллюстрация на Scrapy документы о том, как все Scrapy куски, как промежуточное программное и пауков, работают вместе: http://doc.scrapy.org/en/latest/topics/architecture.html

+1

Думаю, я не мог правильно передать свою цель. Я в основном хочу регистрировать все ссылки, с которыми я сталкиваюсь при очистке веб-сайта, поэтому, даже если его ответ 302, я бы хотел, чтобы искатель сканирования регистрировал исходную ссылку (которая дает 302 ответ), а также целевое местоположение, указанное в заголовок ответа и обработать оба из них в 'parse_item'. – bawejakunal

+0

Scrapy действительно должна регистрировать все. 302 ссылки вышли бы как «scraping перенаправлено с [302]' или что-то в этом роде. – Granitosaurus

+0

Я решил обновить Scrapy до версии 1.0.5, которая, кажется, работает лучше. Спасибо за вашу помощь и совет :) – bawejakunal

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