Почему паук-скрап не идет методом разбора - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь очистить веб-страницу с помощью библиотеки Python Scrapy.

У меня есть следующий код:

class AutoscoutDetailsSpider(scrapy.Spider):
    name = "vehicle details"
    reference_url = ''
    reference = '' 

    def __init__(self, reference_url, reference, *args, **kwargs):
        super(AutoscoutDetailsSpider, self).__init__(*args, **kwargs)
        self.reference_url = reference_url
        self.reference = reference
        destination_url = "https://www.autoscout24.be/nl/aanbod/volkswagen-polo-1-2i-12v-base-birthday-climatronic-benzine-zilver-8913b173-cad5-ec63-e053-e250040a09a8"
        self.start_urls = [destination_url]
        add_logs(self.start_urls)

    def handle_error_response(self):
        add_logs("NOT EXISTS. REFERENCE {} AND REFERENCE URL {}.".format(self.reference, self.reference_url))

    def handle_gone_response(self):
        add_logs("SOLD or NOT AVAILABLE Reference {} and reference_url {} is sold or not available.".format(self.reference, self.reference_url))

    def parse(self, response):
        add_logs("THIS IS RESPONSE {}".format(response))

        if response.status == 404:
            self.handle_error_response()

        if response.status == 410:
            self.handle_gone_response()

        if response.status == 200:
            pass

def start_get_vehicle_job(reference_url, reference):
    try:
        def f(q):
            try:
                runner = crawler.CrawlerRunner()
                deferred = runner.crawl(AutoscoutDetailsSpider, reference_url, reference)
                deferred.addBoth(lambda _: reactor.stop())
                reactor.run()
                q.put(None)
            except Exception as e:
                capture_error(str(e))
                q.put(e)

        q = Queue()
        p = Process(target=f, args=(q,))
        p.start()
        result = q.get()
        p.join()

        if result is not None:
            raise result

        return {"Success.": "The crawler ({0}) is successfully executed.".format(reference_url)}
    except Exception as e:
        capture_error(str(e))
        return {"Failure": "The crawler ({0}) is NOT successfully executed.".format(reference_url)}


def main(params):
    start_get_vehicle_job(params.get('reference_url', None), params.get('reference', None))

Таким образом, первое, что выполняется, это main, с основнымЯ звоню start_get_vehicle_job с reference_url и reference в качестве параметров.И тогда start_get_vehicle_job называет паука-скрапа AutoscoutDetailsSpider.

В __init__ я добавляю URL, который нужно очистить.Параметры reference и reference_url в __init__ являются правильными.add_logs функция просто добавляет текст в базу данных.И add_logs в моем случае в __init__ добавляет правильный URL.enter image description here

Я должен перейти к методу parse, и там я хочу проверить статус ответа.Я добавил add_logs("THIS IS RESPONSE {}".format(response)) в начало метода parse, но я не вижу этого сообщения в своей таблице журналов.

Когда я проверяю этот URL с scrapy shell, он работает нормально, и я получаю response.status 404, что правильно.

enter image description here

Это похоже на то, что паук-скрап совсем не подходит для анализа.

Любойидея?

1 Ответ

0 голосов
/ 24 октября 2018

В случае, если у кого-то еще есть такая же проблема, решением было добавить handle_httpstatus_list = [404] в верхней части паука:

class AutoscoutDetailsSpider(scrapy.Spider):
    handle_httpstatus_list = [404] ############# This line was the key
    name = "vehicle details"
    reference_url = ''
    reference = ''

По умолчанию он обрабатывает только 200 статусов ( документы ).Для обработки других статусов вам необходимо добавить их к handle_httpstatus_list

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...