zoukankan      html  css  js  c++  java
  • [python爬虫]处理js文件的三个方法

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

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

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

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

    下面讲解!

    wifi登录界面                              表单数据

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

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

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

    尝试第二种方法,selenium+phantomjs

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.PhantomJS(executable_path=r'C:Python27phantomjs-2.1.1-windowsinphantomjs.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文件中的该函数:

     整体代码
    #coding:utf-8
    import execjs
    import urllib
    import urllib2
    
    class NetIn(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': ""
            }
    
        def jiaMiPasswd(self):
            print "请输入您的密码"
            passwd = raw_input()
            jiaMiPasswd = execjs.compile(open(r"a41.js").read().decode("utf-8")).call('bingo', passwd)   #这里a41.js已经移动到当前目录了
            return jiaMiPasswd
    
    if __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.

  • 相关阅读:
    ZOJ Problem Set–2417 Lowest Bit
    ZOJ Problem Set–1402 Magnificent Meatballs
    ZOJ Problem Set–1292 Integer Inquiry
    ZOJ Problem Set–1109 Language of FatMouse
    ZOJ Problem Set–1295 Reverse Text
    ZOJ Problem Set–1712 Skew Binary
    ZOJ Problem Set–1151 Word Reversal
    ZOJ Problem Set–1494 Climbing Worm
    ZOJ Problem Set–1251 Box of Bricks
    ZOJ Problem Set–1205 Martian Addition
  • 原文地址:https://www.cnblogs.com/greenteemo/p/6745404.html
Copyright © 2011-2022 走看看