python运行js文件_[python爬虫]处理js文件的三个方法

最近在写一个学校wifi连接登陆的小程序,遇到了表单提交的密码被js文件加密的问题,于是各种google,学到了下面三种方法。

1.js转python,就是将js翻译为python。

2.利用selenium+phantomjs模拟人工操作。

3.利用pyexecjs直接执行js文件

下面讲解!

wifi登录界面                              表单数据

1126176-20170421200325931-161077980.png

1126176-20170421200701118-2016065304.png

DDDDD为用户名,upass为密码,其余参数无影响。

分析发现upass密码是被一个.js文件加密了,找到它!

1126176-20170421201010634-613223562.png

1126176-20170421201031477-1422547934.png

乍一看挺复杂的,刚开始找不到合适的方法,就尝试利用第一种将js翻译为python,但是苦于不懂各种MD5之类的编码方式,又觉得这种方法只能是一对一的,只能解决这一个网页的加密问题,于是放弃寻求其他方法。(PS:不过在网上还是看到了很多人用这种个方法)

尝试第二种方法,selenium+phantomjs

from selenium importwebdriverfrom selenium.webdriver.common.keys importKeys

driver= webdriver.PhantomJS(executable_path=r'C:\Python27\phantomjs-2.1.1-windows\bin\phantomjs.exe')    #windows环境下路径前加 r !!!#driver = webdriver.Chrome()      #也可利用chrome firefox等浏览器实现

driver.get("http://202.113.112.30/0.htm")

elem= driver.find_element_by_name("DDDDD")

elem.send_keys("xxxxxx")

elem= driver.find_element_by_name("upass")

elem.send_keys("xxxxxx")

elem= driver.find_element_by_id("submit").click()

这种方法和你手工登陆实现的效果是一样的,模拟输入账号密码,模拟点击登陆按钮,但是速度较慢,于是探索第三种方法。

jiaMiPasswd = execjs.compile(open(r"a41.js").read().decode("utf-8")).call('bingo', passwd)

重点说一下这一条指令,open后跟所执行的js文件位置,call后第一个单引号引起来的为所执行的js文件的某个function,这里为function bingo(passwd){...},第一个逗号后为带入function的参数,下图为js文件中的该函数:

1126176-20170421202941946-2113114852.png

整体代码

#coding:utf-8

importexecjsimporturllibimporturllib2classNetIn(object):def __init__(self):

self.loginUrl= "http://202.113.112.30/0.htm"self.headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',

}

self.values={'DDDDD': "",'upass': "",'R1': "0",'R2': "1",'para': "00",'0MKKey': "123456",'v6ip': ""}defjiaMiPasswd(self):print "请输入您的密码"passwd=raw_input()

jiaMiPasswd= execjs.compile(open(r"a41.js").read().decode("utf-8")).call('bingo', passwd) #这里a41.js已经移动到当前目录了returnjiaMiPasswdif __name__ == "__main__":

netIn=NetIn()print "请输入您的账号:"uname=raw_input()

netIn.values['DDDDD'] =uname

netIn.values['upass'] =netIn.jiaMiPasswd()

postdata=urllib.urlencode(netIn.values)

request=urllib2.Request(netIn.loginUrl,postdata,netIn.headers)

response=urllib2.urlopen(request)print response.read().decode('gbk')      #最后将页面信息打印出来查看是否成功登陆

第三种方法执行速度较第二种快很多,而且可以解决不同网站用不同js文件的问题。

That's all.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值