2011-07-13 3 views
25

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

Я узнал, что Scrapy может обрабатывать формы (например, логины), как показано на рисунке here. Но проблема в том, что нет формы для заполнения, так что это не совсем то, что мне нужно.

Как я могу просто нажать кнопку, которая затем отображает нужную мне информацию?

Должен ли я использовать внешнюю библиотеку, такую ​​как mechanize или lxml?

ответ

27

Scrapy не может интерпретировать Javascript.

Если вы абсолютно должны взаимодействовать с javascript на странице, вы хотите использовать Selenium.

При использовании Scrapy решение проблемы зависит от того, что делает кнопка.

Если это только что скрытый контент, вы можете очистить данные без проблем, неважно, что он не появится в браузере, HTML все еще существует.

Если динамическое извлечение контента осуществляется с помощью AJAX при нажатии кнопки, лучше всего просмотреть HTTP-запрос, который отключается при нажатии кнопки с помощью инструмента, такого как Firebug. Затем вы можете просто запросить данные непосредственно с этого URL-адреса.

Должен ли я использовать внешнюю библиотеку, такую ​​как mechanize или lxml?

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

Если вы можете указать URL-адрес страницы, на которой работаете, вы можете посмотреть.

+2

Это не реальный ответ на мой актуальный вопрос, но он решает мою проблему, тем не менее. Я проследил запрос сайта в Chrome и нашел ссылку, которая отображает информацию на отдельной странице. Благодаря! Но я не буду отмечать ваш ответ как принятый, потому что другим действительно может понадобиться нажать кнопку. – naeg

+0

@naeg Я думаю, что ответ суммирует его правильно. Вы не можете нажать кнопку Scrapy. Вы можете отправлять запросы и получать ответ. Вы должны интерпретировать ответ с помощью отдельного механизма JavaScript. – Medorator

+0

Как кажется, Acorn отредактировал его ответ, и теперь это полный и принятый ответ на мой вопрос :) – naeg

0

Чтобы правильно и полностью использовать JavaScript вам нужен полный движок браузера, а это возможно только с Watir/WatiN/Selenium и т.д.

8

Selenium браузера обеспечивают очень хорошее решение. Вот пример (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!' 
+0

Если вы даете URL-адрес после нажатия кнопки selenium на parse2, передает ли он html с содержимым, которое было обнаружено щелчок? –

Смежные вопросы