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.

  • 相关阅读:
    你所选择的栏目与当前模型不相符请选择白色的选
    DEDECMS首页调用图片集里的多张图片
    dedecms内容页调用图片集文档的图集图片
    Sublime Text 使用介绍、全套快捷键及插件推荐
    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
    nutch
    ant安装
    selenium经过WebDriverWait实现ajax测试
    查看当前android设备已安装的第三方包
    批处理学习总结之常用符号
  • 原文地址:https://www.cnblogs.com/greenteemo/p/6745404.html
Copyright © 2011-2022 走看看