我想使用requests
模块登录here。在
到目前为止,我已经做到了:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
import requests
from utils.user_agents import get_random_user_agent
class StudentsWebSession(QtCore.QThread):
def __init__(self, url, _url=None, username=None, password=None, payload=None):
QtCore.QThread.__init__(self)
self.session = requests.Session()
self.ua = get_random_user_agent('desktop')
self.headers_get_one = {
'host': 'studentsweb.teimes.gr',
'user-agent': self.ua,
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'accept-language': 'en-US,en;q=0.5',
'accept-encoding': 'gzip, deflate, br',
'connection': 'keep-alive',
'upgrade-insecure-requests': '1'
}
self.headers_post_one = {
'host': 'studentsweb.teimes.gr',
'user-agent': self.ua,
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'accept-language': 'en-US,en;q=0.5',
'accept-encoding': 'gzip, deflate, br',
'referer': 'https://studentsweb.teimes.gr/unistudent/login.asp',
'content-type': 'application/x-www-form-urlencoded',
'connection': 'keep-alive',
'upgrade-insecure-requests': '1'
}
self.headers_get_two = {
'host': 'studentsweb.teimes.gr',
'user-agent': self.ua,
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'accept-language': 'en-US,en;q=0.5',
'accept-encoding': 'gzip, deflate, br',
'referer': 'https://studentsweb.teimes.gr/unistudent/login.asp',
'connection': 'keep-alive',
'upgrade-insecure-requests': '1'
}
self.url = url
self._url = _url
self.username = username
self.password = password
self.payload = payload
def __del__(self):
self.wait()
def get(self):
with self.session as s:
if not self.payload:
self.payload = {
'userName': self.username,
'pwd': self.password,
'submit1': 'Login',
'loginTrue': 'login'
}
r = s.get(self.url, headers=self.headers_get_one,
params={'lang': 'en-us'})
print(r.content.decode('cp1253'))
#print(r.url)
r = s.post(self.url, headers=self.headers_post_one,
data=self.payload)
#print(r.content.decode('cp1253'))
#print(r.url)
#r = s.get(self._url, headers=self.headers_get_two)
#print(r.content.decode('cp1253'))
#print(r.url)
def run(self):
self.get()
我这样初始化它:
^{pr2}$其中db
是一个包含所有所需信息的字典。在
db.get('studentsweb', {}).get('url')
db.get('studentsweb', {}).get('url_after')
结果,我收到了一个标题如下的HTML文档(409http代码)
<title>409 Conflict</title>
我认为您必须执行一个简单的GET请求来存储cookies,然后使用所有必需的有效负载、头和cookies执行POST请求。然后,执行GET请求以接收所需的结果。在
以下是上述要求的证明:
我不喜欢使用selenium、headless浏览器以及非线程安全库
如果你需要更多的信息,请不要犹豫去问他们。在
如何初始化
StudentsWebSession
并调用.get()
?假设self.payload
是None
,它使用if
中定义的self.payload
,那么:'submit1'
应该是'Είσοδος'
,而不是{不要在
headers_post_one
中指定“content length”。当您执行
with requests.Session() as s:
操作时,一旦登录完成,会话就会丢失。将其作为with ... as self.session:
,并在以后的请求中使用self.session
。当发布完成后,一个随机的cookies似乎正在设置中。它是由js在表单submit上生成的。您需要查看它并重新创建cookie并将其与post请求一起发送。而且,它不是您在GET表单中得到的
rcva_
cookie。只有前64个字符匹配:与发送的那个。。。在
另外,发送的表单数据也有一部分cookie具有随机生成的名称,并且只有前32个字符匹配:
不要执行
self.cookies = r.cookies
,因为请求将管理该会话中的cookie(通过重新发送接收到的cookie)。您也不需要显式地提供它,除非您想添加一个单独的cookie,并且应该只包含这些项(以前收到的cookie无论如何都会被发送)。在注意:提交表单时,您需要弄清楚js是如何设置cookies的。然后用Python或者…使用selenium/或其他无头浏览器重新创建它——你说过你不喜欢这样做。
表单数据中的},对于上面的1。
'lang': 'en-us'
可能没有预期的效果,可能会导致错误。要设置网站的方式,请在每个请求中为页面设置参数:r.get(... params={'lang': 'en-us'} ...)
。当您这样做时,'submit1'
应该是{这并不能提供您登录所需的所有信息,但您必须首先进行上述更改,然后再查看您的位置。在
相关问题 更多 >
编程相关推荐