Scrapy并提交一个javascript表单

时间:2014-03-04 13:57:51

标签: javascript python forms scrapy

我正在学习scrapy,并且我试图提交一个由javascript控制的表单。

我尝试过在Stack Overflow上发现的一些事情,包括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()        

更新:

我也尝试过以下各种迭代,但没有运气。当我从网页上提交搜索时,fiddler2告诉我它发布了字符串&#34; cmm = banana&amp; mkt =&amp; search =&#34; ...但是当我使用下面的代码时,小提琴手告诉我什么都没发布......

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

3 个答案:

答案 0 :(得分:4)

显然,该页面由两个框架组成,对源代码的简短一瞥显示了它们的名称“内容”和“主要”。因此,上面的脚本几乎完成了这项工作,只是错过了一条指向右侧框架的行,名为“main”,带有driver.switch_to_frame('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()

答案 1 :(得分:1)

有或没有javascript,最后,呼叫将始终转换为某个http呼叫,使用firebug跟踪该呼叫类型(获取/发布),字段和值被翻译将这些内容添加到您的scrapy请求中。

答案 2 :(得分:0)

使用javascript Selenium IDE会让您的生活更轻松。它是一个firefox-plugin,能够记录你点击的内容。键入firefox,然后向您显示需要放入python脚本的某些元素的代码。对我来说非常有用,不仅仅是表格。 :-)

尝试一下!