2011-07-13 108 views
25

我正在使用Scrapy來抓取網頁。我只需要點擊某個按鈕時彈出一些信息(點擊後當然也出現在HTML代碼中)。單擊Scrapy中的按鈕

我發現Scrapy可以處理的形式(如登錄),如圖here。但問題是沒有填寫表格,所以這不完全是我需要的。

如何簡單地點擊一個按鈕,然後顯示我需要的信息?

我是否必須使用像mechanize或lxml這樣的外部庫?

回答

27

Scrapy無法解釋JavaScript。

如果你絕對必須與頁面上的JavaScript交互,要使用硒。

如果使用Scrapy,問題的解決方案取決於按鈕的功能。

如果它只是顯示了一個以前隱藏的內容,你可以刮的數據沒有問題,也沒有關係,它不會出現在瀏覽器中,HTML仍然存在。

如果它在按下按鈕動態通過AJAX獲取內容,做的最好的事情是查看當你按下使用類似Firebug的工具按鈕熄滅HTTP請求。然後您可以直接從該URL請求數據。

我是否必須使用外部庫,如mechanize或lxml?

如果你想解釋JavaScript,是的,你需要使用不同的庫,雖然這兩個都不符合法案。他們都不知道關於JavaScript的任何信息。硒是要走的路。

如果你可以給你在刮我可以看看工作頁面的URL。

+2

這不是一個真正的答案,以我的實際問題,但它仍然解決了我的問題。我在Chrome中追蹤了網站請求,並找到一個鏈接,在單獨的頁面中顯示信息。謝謝!但我不會將您的答案標記爲已接受,因爲其他人可能確實需要點擊按鈕。 – naeg

+0

@naeg我認爲答案正確地總結了它。您無法使用Scrapy點擊按鈕。您可以發送請求並收到回覆。這取決於您使用單獨的javascript引擎解釋響應。 – Medorator

+0

看起來Acorn編輯了他的答案,現在它對我的問題是一個完整且被接受的答案:) – naeg

0

要正確和充分使用JavaScript,你需要一個完整的瀏覽器引擎,這是可能只的Watir /華廷/硒等

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

如果您在通過selenium to parse2點擊按鈕之後生成url,它是否通過html顯示的內容點擊? –