web-dev-qa-db-fra.com

Cliquez sur un bouton dans Scrapy

J'utilise Scrapy pour explorer une page Web. Certaines des informations dont j'ai besoin n'apparaissent que lorsque vous cliquez sur un certain bouton (bien sûr, elles apparaissent également dans le code HTML après avoir cliqué).

J'ai découvert que Scrapy peut gérer les formulaires (comme les connexions) comme indiqué ici . Mais le problème est qu'il n'y a pas de formulaire à remplir, donc ce n'est pas exactement ce dont j'ai besoin.

Comment puis-je simplement cliquer sur un bouton, qui affiche ensuite les informations dont j'ai besoin?

Dois-je utiliser une bibliothèque externe comme mechanize ou lxml?

37
naeg

Scrapy ne peut pas interpréter javascript.

Si vous devez absolument interagir avec le javascript sur la page, vous souhaitez utiliser Selenium.

Si vous utilisez Scrapy, la solution au problème dépend de ce que fait le bouton.

S'il ne fait que montrer du contenu qui était auparavant masqué, vous pouvez gratter les données sans problème, peu importe qu'elles n'apparaissent pas dans le navigateur, le HTML est toujours là.

S'il récupère le contenu dynamiquement via AJAX lorsque le bouton est enfoncé, la meilleure chose à faire est de visualiser la requête HTTP qui s'éteint lorsque vous appuyez sur le bouton à l'aide d'un outil comme Firebug. Vous pouvez puis demandez simplement les données directement à partir de cette URL.

Dois-je utiliser une bibliothèque externe comme mechanize ou lxml?

Si vous voulez interpréter javascript, oui, vous devez utiliser une bibliothèque différente, bien qu'aucune de ces deux ne corresponde à la facture. Aucun d'eux ne sait quoi que ce soit sur javascript. Le sélénium est la voie à suivre.

Si vous pouvez donner l'URL de la page sur laquelle vous travaillez, je peux y jeter un œil.

44
Acorn

Selenium le navigateur fournit une solution très agréable. Voici un exemple (pip install -U Selenium):

from Selenium import webdriver

class northshoreSpider(Spider):
    name = 'xxx'
    allowed_domains = ['www.example.org']
    start_urls = ['https://www.example.org']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self,response):
            self.driver.get('https://www.example.org/abc')

            while True:
                try:
                    next = self.driver.find_element_by_xpath('//*[@id="BTN_NEXT"]')
                    url = 'http://www.example.org/abcd'
                    yield Request(url,callback=self.parse2)
                    next.click()
                except:
                    break

            self.driver.close()

    def parse2(self,response):
        print 'you are here!'
13
Nima Soroush

Pour utiliser correctement et pleinement JavaScript, vous avez besoin d'un moteur de navigation complet et cela n'est possible qu'avec Watir/WatiN/Selenium, etc.

0
wRAR