2014-03-04 41 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请求。