Scrapy Deploy не соответствует результату отладки

Я использую Scrapy для извлечения некоторых данных с сайта, например «myproject.com». Вот логика:

  1. Перейдите на главную страницу, и есть список categorylist которые будут использоваться для создания второй волны ссылок.
  2. Для второго раунда ссылок они обычно являются первой страницей из каждой категории. Кроме того, для разных страниц внутри этой категории они следуют одному и тому же шаблону регулярных выражений wholesale/something/something/request or wholesale/pagenumber . И я хочу следовать этим шаблонам, чтобы продолжать сканирование и тем временем хранить необработанный HTML-код в объекте item.

Я проверил эти два шага отдельно, используя синтаксический анализ, и они оба работали.

Во-первых, я попробовал:

 scrapy parse http://www.myproject.com/categorylist/cat_a --spider myproject --rules 

И я вижу, что он успешно построил исходящие линии. Затем я снова проверил встроенную линию связи.

 scrapy parse http://www.myproject.com/wholesale/cat_a/request/1 --spider myproject --rules 

И похоже, что правило правильное, и оно генерирует элемент с сохраненным в нем HTML-кодом.

Однако, когда я попытался связать эти два шага вместе, используя аргумент depth . Я видел, как он сканировал исходящие ссылки, но никаких элементов не было создано.

 scrapy parse http://www.myproject.com/categorylist/cat_a --spider myproject --rules --depth 2 

Вот псевдокод:

 class MyprojectSpider(CrawlSpider): name = "Myproject" allowed_domains = ["Myproject.com"] start_urls = ["http://www.Myproject.com/"] rules = ( Rule(LinkExtractor(allow=('/categorylist/\w+',)), callback='parse_category', follow=True), Rule(LinkExtractor(allow=('/wholesale/\w+/(?:wholesale|request)/\d+',)), callback='parse_pricing', follow=True), ) def parse_category(self, response): try: soup = BeautifulSoup(response.body) ... my_request1 = Request(url=myurl1) yield my_request1 my_request2 = Request(url=myurl2) yield my_request2 except: pass def parse_pricing(self, response): item = MyprojectItem() try: item['myurl'] = response.url item['myhtml'] = response.body item['mystatus'] = 'fetched' except: item['mystatus'] = 'failed' return item 

Большое спасибо за любое предложение!

  • Как понять этот необработанный HTML-код Yahoo! Финансы при извлечении данных с помощью Python?
  • При подаче запроса «Прочитать» («Ошибка подтверждения») в сообщении «Механизм» возникает ответ «Ошибка утверждения»
  • python: Существующее соединение было принудительно закрыто удаленным хостом
  • Я не могу получить весь исходный код HTML-страницы
  • Scrapy не сканирует последующие страницы в порядке
  • Начало Scrapy Сканирование после входа в систему
  • Как сохранить кеш в селене в цикле после обновления страницы?
  • Показатели загрузки PyPi кажутся нереалистичными
  • One Solution collect form web for “Scrapy Deploy не соответствует результату отладки”

    Я предполагал, что новые объекты Request которые я построил, будут работать против rules а затем анализируются соответствующей функцией обратного вызова, определяемой в правиле, однако, прочитав документацию Request, метод callback обрабатывается по-другому.

    class scrapy.http.Request (url [, callback, method = 'GET', заголовки, куки, файлы cookie, мета, encoding = 'utf-8', priority = 0, dont_filter = False, errback])

    callback (callable) – функция, которая будет вызываться с ответом этого запроса (после его загрузки) в качестве первого параметра. Дополнительные сведения см. В разделе «Передача дополнительных данных для функций обратного вызова» ниже. Если в запросе не указан обратный вызов, будет использоваться метод parse () паука . Обратите внимание, что если исключения возникают во время обработки, вместо этого вызывается errback.

     ... my_request1 = Request(url=myurl1, callback=self.parse_pricing) yield my_request1 my_request2 = Request(url=myurl2, callback=self.parse_pricing) yield my_request2 ... 

    По-другому, даже если URL-адреса, которые я построил, соответствуют второму правилу, он не будет передан parse_pricing . Надеюсь, это полезно другим людям.

    Python - лучший язык программирования в мире.