Почему функция print () не отображается на консоли? - PullRequest
0 голосов
/ 01 октября 2018

Я не писал ни одного кода Python более 10 лет.Поэтому я пытаюсь использовать Scrapy для сбора некоторой информации с веб-сайта:

import scrapy

class TutorialSpider(scrapy.Spider):
    name = "tutorial"

    def start_requests(self):
        urls = [
            'https://example.com/page/1',
            'https://example.com/page/2',
        ]
        for url in urls:
            print(f'{self.name} spider')
            print(f'url is {url}')
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        print(response.url)
        self.log(response.url)
        sys.stdout.write('hello')

Я пытаюсь проанализировать URL в методе parse.Я не могу понять, почему эти простые print операторы ничего не выводят на стандартный вывод?Они молчат.Кажется, что нет никакого способа отразить что-либо там обратно в консоль, и мне очень любопытно, что мне здесь не хватает.

1 Ответ

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

Оба запроса, которые вы делаете в своем пауке, получают 404 Not found ответов.По умолчанию Scrapy игнорирует ответы с таким статусом, и ваш обратный вызов не вызывается.

Для того, чтобы ваш обратный вызов self.parse вызывался для таких ответов, вы должны добавить код состояния 404 всписок обработанных кодов состояния с использованием мета-ключа handle_httpstatus_list (подробнее здесь ).

Вы можете изменить свой метод start_requests, чтобы запросы давали Scrapy команду обрабатывать даже 404 ответа.:

import scrapy

class TutorialSpider(scrapy.Spider):
    name = "tutorial"

    def start_requests(self):
        urls = [
            'https://example.com/page/1',
            'https://example.com/page/2',
        ]
        for url in urls:
            print(f'{self.name} spider')
            print(f'url is {url}')
            yield scrapy.Request(
                url=url,
                callback=self.parse,
                meta={'handle_httpstatus_list': [404]},
            )

    def parse(self, response):
        print(response.url)
        self.log(response.url)
        sys.stdout.write('hello')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...