我用classmethod
创建了一个python脚本,在loging in
在网页中输入凭证之后获取profilename
。脚本能够以正确的方式获取profilename
。我现在想做的是在classmethod
中使用session
。session
已经在__init__()
方法中定义。I would like to keep the existing design intact
。你知道吗
这是我迄今为止尝试过的:
import requests
from bs4 import BeautifulSoup
class StackOverflow:
SEARCH_URL = "https://stackoverflow.com/users/login?ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f"
def __init__(self,session):
self.session = session
@classmethod
def crawl(cls,email,password):
page = requests.get(cls.SEARCH_URL,headers={"User-Agent":"Mozilla/5.0"})
sauce = BeautifulSoup(page.text, "lxml")
fkey = sauce.select_one("[name='fkey']")["value"]
payload = {"fkey": fkey,"email": email,"password": password,}
res = requests.post(cls.SEARCH_URL,data=payload,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text, "lxml")
user = soup.select_one("div[class^='gravatar-wrapper-']").get("title")
yield user
if __name__ == '__main__':
with requests.Session() as s:
result = StackOverflow(s)
for item in result.crawl("email", "password"):
print(item)
如何在classmethod中使用session
从__init__
获取?
不能从类方法访问
self.session
。方法__init__
在创建类的实例时被调用,但是类方法不绑定到类的任何特定实例,而是绑定到类本身-这就是为什么第一个参数通常是cls
,而不是self
。你知道吗您决定在
__init__
中创建会话,因此可以假设把他们的疗程分开。如果这确实是您的意图,
crawl
方法不应该用@classmethod
注释。如果您有crawl(self, email, pass):
,那么您仍然可以使用StackOverflow.SEARCH_URL
和self.__class__.SEARCH_URL
来获取StackOverflow类中定义的值,或者self.SEARCH_URL
默认情况下将获取相同的值,但是可以使用so1.SEARCH_URL = "sth else"
进行更改(但是so2.SEARCH_URL
将保留其原始值)相关问题 更多 >
编程相关推荐