javascript 함수 치료 및 자바 스크립트 양식 제출




자바스크립트 함수 (3)

나는 치료법을 배우고 있으며 javascript에 의해 제어되는 양식을 제출하려고하는 걸림돌을 만났습니다.

셀레늄을 포함하여 스택 오버플로에서 발견되었지만 행운이없는 여러 가지 이유로 여기를 시도해 보았습니다 (여러 가지 이유로).

내가 긁을 필요가있는 페이지는 ... http://agmarknet.nic.in/

... 상품 검색. 나는 요소를 검사 할 때 상품 가치가 필요한 "cmm"형식으로 양식 "m"을 갖고있는 것처럼 보입니다.

<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>

어떤 조언도 기꺼이 받아 들였습니다!

업데이트 : 나는 이것을 셀레늄으로 시도했지만 필드를 찾거나 채우지 않습니다. 파이어 폭스 창을 띄우지 않고도이 작업을 수행 할 수 있다는 생각이 들지 않습니다.

    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는 "cmm = banana & mkt = & search ="문자열을 post'ing한다고 알려주지 만, 아래 코드를 사용하면 피들러가 아무 것도 게시되지 않는다고합니다.

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

자바 스크립트가 있든 없든 결국 호출은 항상 http 호출로 변환되고 firebug를 사용하여 호출 유형 (가져 오기 / 게시), 필드 및 값을 추적하여 추적 요청에 추가합니다.


분명히이 페이지는 두 개의 프레임으로 구성되어 있으며, 소스의 짧은 글자는 이름의 '내용'과 '기본'을 나타냅니다. 따라서 위의 스크립트는 거의 작업을 수행하며 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()

무엇이 당신의 인생을 더욱 쉽게 자바 스크립트 Selenium IDE 와 함께하게됩니다. 파이어 폭스 플러그인을 클릭하고 파이어 폭스를 입력 한 후 파이썬 스크립트에 넣어야 할 특정 요소에 대한 코드를 보여줄 수 있습니다. 양식뿐만 아니라 나를 위해 매우 유용했습니다. :-)

그것을 밖으로 시도하십시오!





scrapy