[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:\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文件中的該函數:

 

 整體代碼
#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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM