Python mechanize 提交 JavaScript 按钮问题!

3 投票
1 回答
5537 浏览
提问于 2025-04-16 04:36

我正在用 mechanize.browser 模块写一个脚本。

现在遇到一个问题,其他都没问题,但在提交表单时,它不工作。

所以我找到了一个可疑的地方。

在 HTML 源代码中,我发现了以下内容。

我在想,loginCheck(this) 可能是在提交表单时出问题的地方。

但是我该如何用 mechanize 模块处理这种 JavaScript 函数,这样我才能成功提交表单并接收到结果呢?

以下是与 loginCheck(this) JavaScript 函数相关的网页源代码片段。

        function init(){
        FRMLOGIN.ID.focus();
    }

    function loginCheck(f){
        if(chkNull(f.ID, "아이디를"))
            return false;

        if(chkNull(f.PWD, "패스워드를"))
            return false;

        //f.target = "ifrmLoginHidden";
        f.action = (f.SECCHK.checked) ? "https://user.buddybuddy.co.kr/Login/Login.asp" : "http://user.buddybuddy.co.kr/Login/Login.asp";
    }

我知道 mechanize 不支持 JavaScript,所以我想用 Python 的 mechanize 代码来编写 loginCheck() 函数。

有没有人能帮我把这个 JavaScript 函数转换成 Python 的 mechanize 代码?

这样我就可以正确登录网站了。

如果能帮忙,我会非常感激!

    # -*- coding: cp949-*-
import sys,os
import mechanize, urllib
import cookielib
from BeautifulSoup import BeautifulSoup,BeautifulStoneSoup,Tag
import datetime, time, socket
import re,sys,os,mechanize,urllib,time


br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

# Want debugging messages?
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)

# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6')]
br.open('http://user.buddybuddy.co.kr/Login/LoginForm.asp?URL=')
html = br.response().read()
print html

br.select_form(name='FRMLOGIN')
print br.viewing_html()
br.form['ID']='psh7943'
br.form['PWD']='qkrthgus'
br.submit()

print br.response().read()

如果有人能帮我……非常感谢!!

1 个回答

4

你可以在浏览器里手动进行登录操作,然后使用一些工具(比如Firefox的Firebug,或者Chrome的开发者工具)来查看当你点击“确定”按钮时,发送了哪些请求到网站。通常情况下,这会是一个POST请求,里面包含了从登录表单中获取的数据。你可以检查一下这个请求里发送了哪些数据,然后自己发一个POST请求,内容如下:

mechanize.urlopen(URL, POST_DATA). 

你可以通过mechanize的表单对象提取POST_DATA(和post_url),方法是:

form.click_request_data()

不过你可能需要做一些修改。

这里有一个非常简单的例子:

br.select_form(name='form_name')
br.form['login']='login'
br.form['pass']='pass'
post_url, post_data, headers =  br.form.click_request_data()
mechanize.urlopen(post_url, post_data)

撰写回答