Как объединить несколько команд yield в сценарий scrapy - PullRequest
0 голосов
/ 23 января 2019

Моя проблема в том, что когда я добавил код перенаправления из Не удается заставить Scrapy проанализировать и выполнить 301, перенаправления 302 в мой скрипт, это решило проблему в том, что теперь он работает без ошибок, ноТеперь я не получаю вывод в мой CSV-файл.Проблема в том, что в parse_links1 операторы if и else заканчиваются оператором yield, и это, похоже, препятствует реализации строки scrapy.Request.Это довольно ясно, так как в предыдущей итерации этого кода, который опустился только на 2 уровня ссылок, код работал отлично.Но поскольку последний уровень имеет проблему с перенаправлением, мне пришлось добавить этот код.

Мой код такой:

    class TurboSpider(scrapy.Spider):
        name = "fourtier"
        handle_httpstatus_list = [404]
        start_urls = [
         "https://ttlc.intuit.com/browse/cd-download-support"]
        # def parse gets first set of links to use
        def parse(self, response):

            links = response.selector.xpath('//ul[contains(@class, 
         "list-unstyled")]//@href').extract()
            for link in links:
                 yield scrapy.Request(link, self.parse_links, 
                   dont_filter=True)


        def parse_links(self, response):
            tier2_text = response.selector.xpath('//a[contains(@class, 
    "dropdown-item-link")]//@href').extract()
            for link in tier2_text:
                schema = 'https://turbotax.intuit.com/'
                links_to_use = urlparse.urljoin(schema, link)
                yield scrapy.Request(links_to_use, self.parse_links1)


        def parse_links1(self, response):
            tier2A_text = response.selector.xpath('//a').extract()

            for t in tier2A_text:
                if response.status >= 300 and response.status < 400:
                   # HTTP header is ascii or latin1, redirected url will be percent-encoded utf-8
                  location= 
           to_native_str(response.headers['location'].decode('latin1'))
                    request = response.request
                    redirected_url = urljoin(request.url, location)
                    if response.status in (301, 307) or request.method 
                    == 'HEAD':
                        redirected = 
                    request.replace(url=redirected_url)
                        yield redirected
                    else:
                        redirected = 
            request.replace(url=redirected_url, 
                    method='GET', body='')
                        redirected.headers.pop('Content-Type', None)
                        redirected.headers.pop('Content-Length', None)
                        yield redirected
                    yield scrapy.Request((t, self.parse_links2))


        def parse_links2(self, response):
            divs = response.selector.xpath('//div')
            for p in divs.select('.//p'):
                yield{'text':p.extract()}

Что не так с тем, как я настроил«yield» в функции parse_links1, так что теперь я не получаю вывод?Как объединить несколько команд yield?

1 Ответ

0 голосов
/ 23 января 2019

См. Отладочные пауки .

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

...