Scrapy - Xpath работает в оболочке, но не в коде - PullRequest
0 голосов
/ 25 апреля 2018

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

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

import scrapy


class MySpider(scrapy.Spider):
    name = 'MySpider'

    start_urls = [ #WRONG URL, SHOULD BE https://shop.app4health.it/ PROBLEM SOLVED!
        'https://www.app4health.it/',
    ]

    def parse(self, response):
        self.logger.info('A response from %s just arrived!', response.url)
        print ('PRE RISULTATI')

        results =  response.selector.xpath('//*[@id="nav"]/ol/li[*]/a/@href').extract()
        # results = response.css('li a>href').extract()


        # This works on scrapy shell, not in code
        #risultati =  response.xpath('//*[@id="nav"]/ol/li[1]/a').extract()
        print (risultati)




        #for pagineitems in risultati:
               # next_page = pagineitems 
        print ('NEXT PAGE')
        #Ignores the request cause already done. Insert dont filter
        yield scrapy.Request(url=risultati, callback=self.prodotti,dont_filter = True)

    def prodotti(self, response):
        self.logger.info('A REEEESPONSEEEEEE from %s just arrived!', response.url)
        return 1

Веб-сайт, который я пытаюсь сканировать, - https://shop.app4health.it/

Используемая мной команда xpath:

response.selector.xpath('//*[@id="nav"]/ol/li[*]/a/@href').extract()

Я знаю, что есть некоторые проблемы с prodotti функцией ecc ..., но этоне в этом дело.Я хотел бы понять, почему селектор xpath работает с оболочкой scrapy (я получаю именно те ссылки, которые мне нужны), но когда я запускаю его в своем пауке, я всегда получаю нулевой список.

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

Спасибо за помощь:)

РЕДАКТИРОВАТЬ : я попытался напечатать тело первого ответа (из start_urls), и это правильно, я получаю страницу, которую хочу.Когда я использую селекторы в моем коде (даже тот, который был предложен), они все прекрасно работают в оболочке, но я ничего не получаю в своем коде!

РЕДАКТИРОВАТЬ 2 Я стал более опытным с Scrapy и веб-сканированием, и я понял, что иногда HTML-страница, которую вы получаете в своем браузере, может отличаться от той, которую вы получаете сЗапрос на терапию!По моему опыту, какой-то веб-сайт отвечал бы другим HTML-кодом, чем тот, который вы видите в своем браузере!Вот почему иногда, если вы используете «правильный» запрос xpath / css, полученный из браузера, он может ничего не возвращать, если используется в вашем коде Scrapy.Всегда проверяйте, является ли тело вашего ответа тем, чего вы ожидали!

решено : путь указан правильно.Я неправильно написал start_urls!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

В качестве альтернативы ответу Десперадо вы можете использовать селекторы css, которые намного проще, но более чем достаточны для вашего случая использования:

$ scrapy shell "https://shop.app4health.it/"
In [1]: response.css('.level0 .level-top::attr(href)').extract()
Out[1]: 
['https://shop.app4health.it/sonno',
 'https://shop.app4health.it/monitoraggio-e-diagnostica',
 'https://shop.app4health.it/terapia',
 'https://shop.app4health.it/integratori-alimentari',
 'https://shop.app4health.it/fitness',
 'https://shop.app4health.it/benessere',
 'https://shop.app4health.it/ausili',
 'https://shop.app4health.it/prodotti-in-offerta',
 'https://shop.app4health.it/kit-regalo']

scrapy shell команда идеально подходит для отладки подобных проблем.

0 голосов
/ 25 апреля 2018
    //nav[@id="mmenu"]//ul/li[contains(@class,"level0")]/a[contains(@class,"level-top")]/@href 

используйте этот xpath, также рассмотрите 'view-source' страницы перед созданием xpath

...