2014-03-04 42 views
1

我正在學習scrapy,並且遇到了試圖提交由javascript控制的表單的障礙。Scrapy並提交一個JavaScript表格

我試過用堆棧溢出(包括Selenium)在這裏發現的一些東西進行實驗,但沒有運氣(出於多種原因)。

我需要刮的頁面是... http://agmarknet.nic.in/

...和做商品搜索。當我檢查元素時,它看起來有一個「m」形式,提交的「cmm」需要商品價值。

<form name="m" method="post"> 
(...) 
<input type="text" name="cmm" onchange="return validateName(document.m.cmm.value);" size="13"> 
(...) 
<input type="button" value="Go" name="Go3" style="color: #000080; font-size: 8pt; font-family: Arial; font-weight: bold" onclick="search1();"></td> 

任何建議感激地接受!

更新: 我試過用硒,但它沒有找到或填充該字段。我也不會介意能夠做到這一點沒有彈出一個Firefox窗口...

CrawlSpider.__init__(self) 
    self.verificationErrors = [] 

    from selenium import webdriver 
    from selenium.webdriver.common.keys import Keys 

    driver = webdriver.Firefox() 
    driver.get("http://agmarknet.nic.in/") 
    time.sleep(4) 
    elem = driver.find_element_by_name("cmm") 
    elem.send_keys("banana") 
    time.sleep(5) 
    elem.send_keys(Keys.RETURN) 
    driver.close()   

UPDATE:

我也試過以下的各種迭代,但沒有運氣。當我從網頁提交搜索時,fiddler2告訴我它正在傳輸字符串「cmm = banana & mkt = & search =」...但是當我使用下面的代碼時,提琴手告訴我沒有任何內容正在發佈。 ..

class Agmarknet(Spider): 
    name = "agmarknet" 
    start_urls = ["http://agmarknet.nic.in/SearchCmmMkt.asp"] 


    def parse(self, response): 
     return [FormRequest.from_response(
        response, 
        #formname = "cmm1", 
        formdata={ 
        'method':'post', 
        'cmm': 'banana', 
        'mkt': '', 
        'search':''}, 
        callback=self.after_search)] 

    def after_search(self): 
     print response.body 

產量從上圖:

{'download_timeout': 180, 'download_latency': 13.44700002670288, 'proxy': 'http://127.0.0.1:8888', 'download_slot': 'agmarknet.nic.in'} 
Spider error processing <GET http://agmarknet.nic.in/SearchCmmMkt.asp> 
Traceback (most recent call last): 
    File "Z:\WinPython-32bit-2.7.6.2\python-2.7.6\lib\site-packages\twisted\internet\base.py", line 1201, in mainLoop 
    self.runUntilCurrent() 
    File "Z:\WinPython-32bit-2.7.6.2\python-2.7.6\lib\site-packages\twisted\internet\base.py", line 824, in runUntilCurrent 
    call.func(*call.args, **call.kw) 
    File "Z:\WinPython-32bit-2.7.6.2\python-2.7.6\lib\site-packages\twisted\internet\defer.py", line 382, in callback 
    self._startRunCallbacks(result) 
    File "Z:\WinPython-32bit-2.7.6.2\python-2.7.6\lib\site-packages\twisted\internet\defer.py", line 490, in _startRunCallbacks 
    self._runCallbacks() 
--- <exception caught here> --- 
    File "Z:\WinPython-32bit-2.7.6.2\python-2.7.6\lib\site-packages\twisted\internet\defer.py", line 577, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "Z:\WindowsDocuments\eclipseworkspaces\BioCom\manoliagro-agmarknetscraper\src\bin\agmarknetscraper\spiders\agmarknet.py", line 34, in parse 
    callback=self.after_search)] 
    File "Z:\WinPython-32bit-2.7.6.2\python-2.7.6\lib\site-packages\scrapy-0.22.0-py2.7.egg\scrapy\http\request\form.py", line 36, in from_response 
    form = _get_form(response, formname, formnumber, formxpath) 
    File "Z:\WinPython-32bit-2.7.6.2\python-2.7.6\lib\site-packages\scrapy-0.22.0-py2.7.egg\scrapy\http\request\form.py", line 59, in _get_form 
    raise ValueError("No <form> element found in %s" % response) 
exceptions.ValueError: No <form> element found in <200 http://agmarknet.nic.in/SearchCmmMkt.asp> 
SpiderRun done 

回答

2

很明顯,該頁面由兩個框架組成,對源代碼的簡短瀏覽顯示了它們的名稱「內容」和「主要」。所以你的腳本幾乎完成了這項工作,只是缺少一個指向與driver.switch_to_frame('main')一起被稱爲'main'的右邊框。此外,表格不會對ENTER鍵作出反應,我們的確需要選擇按鈕並按下它:-)。

此代碼工作:

import time 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Firefox() 
driver.get("http://agmarknet.nic.in/") 
time.sleep(4) 

driver.switch_to_frame('main') 
textinput = driver.find_element_by_name('cmm') 
textinput.send_keys("banana") 
time.sleep(1) 

button = driver.find_element_by_name("Go3") 
button.click() 
driver.close() 
+0

巴里奧斯。謝謝!輝煌!如果可以的話,我有一個後續問題......是否可以從搜索後頁面獲取數據,而不必讓瀏覽器實際彈出(沉默在後臺) – RightmireM

+1

TNX讚揚,並不難想象:-)。您確實可以使用PhantomJS等所謂的「無頭」瀏覽器,而硒沒有顯示。我不知道這個瀏覽器工作得如何。如果你在一臺linux機器上,你也可以使用[xvfbwrapper](https://pypi.python.org/pypi/xvfbwrapper/0.1.3) – barrios

+0

將Firefox放在X-window-system的虛擬幀緩衝區中。所以我碰到了另一個有這個問題的bug。我不確定是否適合在這裏發佈它,所以我開始了一個新的線程... http://stackoverflow.com/questions/22203080/selenium-will-not-click-button – RightmireM

0

什麼讓您的生活更輕鬆尤其是JavaScript是Selenium IDE。它是一個firefox插件,能夠記錄你在firefox中點擊&類型,然後顯示你需要放入你的python腳本的某些元素的代碼。對我來說非常有用,不僅有形式。 :-)

試一試!

+0

感謝您的輸入。我會看看IDE。我確實使用了Fiddler2,並且我認爲它的名稱請求沿着name = cmm&mkt =&search =的行,但我無法獲得通過scrapy請求發佈的發佈請求。你能指引我使用一些代碼片段嗎? – RightmireM

+0

所以,我試着用Firefox的硒IDE,它實際上沒有記錄任何東西。它顯示的只是一個OpenAndWait,沒有更多,儘管我完成了搜索並獲得了結果。 – RightmireM

1

帶或不帶javascript,最後,電話將總是被翻譯成某個http調用,使用firebug跟蹤這個調用類型(get/post),字段和值被轉換爲並添加那些到您的scrapy請求。