Can';t使用python登录网页-动态键值对/模糊js代码解析
我最近开始学习Python,并决定开始我的第一个项目,其中包括清理我大学的网站。现在我被卡住了,因为我无法通过登录页面。基本上,我面临的问题与上述问题完全相同 根据我有限的理解和@t.m.adam发布的最后一条评论,似乎我需要在登录页面上使用inspect元素,搜索第11个标记并用regex解析js代码。但我几乎迷路了,因为第11个标签看起来一点也不像十六进制字符串 我将我的代码张贴在下面以供参考:Can';t使用python登录网页-动态键值对/模糊js代码解析,python,web-scraping,nodejs,Python,Web Scraping,Nodejs,我最近开始学习Python,并决定开始我的第一个项目,其中包括清理我大学的网站。现在我被卡住了,因为我无法通过登录页面。基本上,我面临的问题与上述问题完全相同 根据我有限的理解和@t.m.adam发布的最后一条评论,似乎我需要在登录页面上使用inspect元素,搜索第11个标记并用regex解析js代码。但我几乎迷路了,因为第11个标签看起来一点也不像十六进制字符串 我将我的代码张贴在下面以供参考: import requests from bs4 import BeautifulSoup
import requests
from bs4 import BeautifulSoup
# all cookies received will be stored in the session object
s = requests.Session()
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Content-Type': 'application/x-www-form-urlencoded',
'Origin': 'https://student.cc.uoc.gr',
'DNT': '1',
'Connection': 'keep-alive',
'Referer': 'https://student.cc.uoc.gr/login.asp?mnuID=student&autologoff=1',
'Upgrade-Insecure-Requests': '1',
}
data = {
'userName': '*****',
'pwd': '*****',
'submit1': '%C5%DF%F3%EF%E4%EF%F2',
'loginTrue': 'login',
}
# Add headers in session.
s.headers.update(headers)
page = s.get('https://student.cc.uoc.gr')
login = s.post('https://student.cc.uoc.gr/login.asp', data=data)
home_page = s.get("https://student.cc.uoc.gr/studentMain.asp")
target = s.get("https://student.cc.uoc.gr/stud_CResults.asp")
soup = BeautifulSoup(target.content,"lxml", from_encoding='utf8')
print(soup.text)
有一个通过中加载的脚本动态加载的aditionnal参数。您需要解码该字符串。在JS中解码很简单,但需要python中的库,但您也可以在(从)中制作一个小脚本:
“使用严格的”
函数解码(src){
如果(src.length>0){
变量l=''
如果(src.length>3&&src.slice(src.length-3)=')()'){
var s=src.slice(0,src.length-2)
var i=s.长度
而(我--){
l=s.切片(i)
if(l.split(').length==l.split('(').length){
打破
}
}
}
否则{
l=src;
}
var结果=评估值(l);
返回结果
}
返回“”;
}
如果(process.argv.length存在一个通过中加载的脚本动态加载的aditionnal参数。您需要解码该字符串。在JS中解码该字符串很简单,但需要python中的库,但也可以在(从)中生成一个小脚本:
“使用严格的”
函数解码(src){
如果(src.length>0){
变量l=''
如果(src.length>3&&src.slice(src.length-3)=')()'){
var s=src.slice(0,src.length-2)
var i=s.长度
而(我--){
l=s.切片(i)
if(l.split(').length==l.split('(').length){
打破
}
}
}
否则{
l=src;
}
var结果=评估值(l);
返回结果
}
返回“”;
}
如果(process.argv.length非常感谢!我尝试了这两种解决方案,只是想看看我能走多远。老实说,基于unjsfuck.js的实现非常棘手,所以过了一段时间,我选择了selenium路线。虽然我没有这方面的经验,但我发现它非常简单,尽管在这一过程中有一些坎坷,因为它没有我似乎不太喜欢Firefox安装在我的系统上的方式。最后,我让它工作了,甚至设置了一个电报机器人来定期自动转发数据。再次感谢您投入时间来帮助我!非常感谢!我尝试了两种解决方案,只是想看看我能走多远。老实说,是实现基础在unjsfuck.js上的d是相当棘手的,所以过了一段时间我选择了selenium路线。虽然我没有这方面的经验,但我发现它非常简单,尽管在这一过程中有一些坎坷,因为它似乎不太喜欢Firefox在我的系统上的安装方式。最后我让它工作起来,甚至设置了一个电报机器人来自动化我会定期转发数据。再次感谢您及时帮助我!
node unjsfuck.js '[][(![]+[])[+[]]+([![].........)'
import requests
from bs4 import BeautifulSoup
import subprocess
import re
s = requests.Session()
r = s.get("https://student.cc.uoc.gr/login.asp")
soup = BeautifulSoup(r.content, "lxml")
jsfuck = [ t.text for t in soup.find_all("script") if t.text.startswith("eval")][0]
result = subprocess.run(['node', 'unjsfuck.js', jsfuck[5:-2]], stdout=subprocess.PIPE)
decoded = result.stdout.decode("utf-8")
token_name = re.search('\'name\'\s*,\s*\'(\w*)\'', decoded).group(1)
token_value = re.search('\'value\'\s*,\s*\'(\w*)\'', decoded).group(1)
form = soup.find("form")
payload = dict([
(t["name"], t.get("value")) for t in form.find_all("input")
])
payload[token_name] = token_value
payload["userName"] = "your username here"
payload["pwd"] = "your password here"
print(payload)
r = s.post("https://student.cc.uoc.gr/login.asp", data = payload)
print(r.text)