无法在webscrap的classmethod中使用会话

2024-07-03 05:52:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我用classmethod创建了一个python脚本,在loging in在网页中输入凭证之后获取profilename。脚本能够以正确的方式获取profilename。我现在想做的是在classmethod中使用sessionsession已经在__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__获取?


Tags: inimport脚本urlsearchinitemailsession
1条回答
网友
1楼 · 发布于 2024-07-03 05:52:34

不能从类方法访问self.session。方法__init__在创建类的实例时被调用,但是类方法不绑定到类的任何特定实例,而是绑定到类本身-这就是为什么第一个参数通常是cls,而不是self。你知道吗

您决定在__init__中创建会话,因此可以假设

so1 = StackOverflow()
so2 = StackOverflow()

把他们的疗程分开。如果这确实是您的意图,crawl方法不应该用@classmethod注释。如果您有crawl(self, email, pass):,那么您仍然可以使用StackOverflow.SEARCH_URLself.__class__.SEARCH_URL来获取StackOverflow类中定义的值,或者self.SEARCH_URL默认情况下将获取相同的值,但是可以使用so1.SEARCH_URL = "sth else"进行更改(但是so2.SEARCH_URL将保留其原始值)

相关问题 更多 >