Нет внутреннего вызова метода с помощью скрапа - PullRequest
0 голосов
/ 08 октября 2019

Я использую скрапс для сканирования сайта. Первый звонок кажется нормальным и собирает некоторые данные. Для каждого последующего запроса мне нужна информация из другого запроса. Для упрощения программирования я разделил разные запросы на разные вызовы методов. Но похоже, что scrapy не предоставляет вызовы методов с каким-то особым параметром. Каждый дополнительный вызов не будет выполнен.

Я уже пробовал несколько разных вещей:

  1. Вызывается метод экземпляра с помощью self.sendQueryHash (response, tagName, afterHash)

  2. Вызвал статический метод с помощью sendQueryHash (response, tagName, afterHash) и изменил отступ

  3. Удалил вызов метода, и он заработал. Я видел выходные данные sendQueryHash на регистраторе.

import scrapy
import re
import json
import logging

class TestpostSpider(scrapy.Spider):
    name = 'testPost'
    allowed_domains = ['test.com']

    tags = [
         "this"
        ,"that"   ]

    def start_requests(self):
        requests = []
        for i, value in enumerate(self.tags):
            url = "https://www.test.com/{}/".format(value)
            requests.append(scrapy.Request(
                        url,
                        meta={'cookiejar': i},
                        callback=self.parsefirstAccess))
        return requests

    def parsefirstAccess(self, response):
        self.logger.info("parsefirstAccess")
        jsonData = response.text

        # That call works fine
        tagName, hasNext, afterHash = self.extractFirstNextPageData(jsonData)
        yield {
                'json':jsonData,
                'requestTime':int(round(time.time() * 1000)),
                'requestNumber':0
        }

        if not hasNext:
            self.logger.info("hasNext is false")
            # No more data available stop processing
            return
        else:
            self.logger.info("hasNext is true")
            # Send request to get the query hash of the current tag
            self.sendQueryHash(response, tagName, afterHash) # Problem occures here

    ## 3.
    def sendQueryHash(self, response, tagName, afterHash):
        self.logger.info("sendQueryHash")
        request = scrapy.Request(
            "https://www.test.com/static/bundles/es6/TagPageContainer.js/21d3cb18e725.js",
            meta={'cookiejar': response.meta['cookiejar']},
            callback=self.parseQueryHash,
            dont_filter=True)
        request.cb_kwargs['tagName'] = tagName
        request.cb_kwargs['afterHash'] = afterHash
        yield request

    def extractFirstNextPageData(self, json):
        return "data1", True, "data3"

Я ожидаю, что вывод sendQueryHash будет показан, но этого никогда не произойдет. Только когда я закомментирую строки self.sendQueryHash и def sendQueryHash.

Это только один пример поведения, которого я не ожидаю.

1 Ответ

1 голос
/ 08 октября 2019
self.sendQueryHash(response, tagName, afterHash) # Problem occures here

просто создаст генератор, с которым вы ничего не делаете. Вы должны убедиться, что вы yield ваш Request вернулись к scrapy движку. Поскольку возвращается только один запрос, вы можете использовать return вместо yield из sendQueryHash, а затем непосредственно yield Request, заменив вышеуказанную строку на

yield self.sendQueryHash(response, tagName, afterHash)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...