关于#python#的问题,如何解决?


看不明白我到底那里错了,耗了一个多小时了


class YieBao_Spider(object):
    def __int__(self):
        self.url = "https://tieba.baidu.com/f?"
        self.headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/112.0.0.0 Safari/537.36"}

    #
    def get_data_index(self):
        params = {
            "kw": "周传雄",
            "ie": "utf-8",
            "fn": "0"
        }
        url = self.url + urlencode(params)
        response = requests.get(url, headers=self.headers)
        response.encoding = "utf-8"
        # 判断响应状态码是不是200
        if response.status_code == 200:
            return response.text
        else:
            return None

    def write_data_index(self, response):
        file_name = "贴吧.html"
        with open("./贴吧/" + file_name, "a", encoding="utf-8") as f:
            f.write(response)
            print("保存成功")

    def run(self):
        response = self.get_data_index()
        self.write_data_index(response)


if __name__ == '__main__':
    sr = YieBao_Spider()
    sr.run()

报错
Traceback (most recent call last):
File "F:\pythonproject\爬虫\requests基础\requests0.py", line 85, in
sr.run()
File "F:\pythonproject\爬虫\requests基础\requests0.py", line 79, in run
response = self.get_data_index()
File "F:\pythonproject\爬虫\requests基础\requests0.py", line 63, in get_data_index
url = self.url + urlencode(params)
AttributeError: 'YieBao_Spider' object has no attribute 'url'

该回答引用ChatGPT

看起来您的代码有一个拼写错误,导致在实例化类时没有正确设置实例变量。在YieBao_Spider类的构造函数中,您将__init__错误地拼写成了__int__,这会导致类没有正确初始化self.url属性,因此在调用get_data_index方法时会出现AttributeError。

要解决此问题,请将__int__改为__init__,这将确保您的类在实例化时正确设置self.url属性。例如:


class YieBao_Spider(object):
    def __init__(self):
        self.url = "https://tieba.baidu.com/f?"
        self.headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/112.0.0.0 Safari/537.36"}
 
    # 省略 get_data_index 和 write_data_index 方法

    def run(self):
        response = self.get_data_index()
        self.write_data_index(response)
 
if __name__ == '__main__':
    sr = YieBao_Spider()
    sr.run()

注意,__init__方法的正确拼写是双下划线 + init + 双下划线,这是Python中约定的构造函数名称。

您的代码中__init__方法名中的int拼写错误应该是__init__,将int修改为init,并将self.url和self.headers提前定义即可解决这个问题。

以下是修改后的代码

from urllib.parse import urlencode
import requests

class YieBao_Spider(object):
    def __init__(self):
        self.url = "https://tieba.baidu.com/f?"
        self.headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/112.0.0.0 Safari/537.36"
        }

    def get_data_index(self):
        params = {
            "kw": "周传雄",
            "ie": "utf-8",
            "fn": "0"
        }
        url = self.url + urlencode(params)
        response = requests.get(url, headers=self.headers)
        response.encoding = "utf-8"
        # 判断响应状态码是不是200
        if response.status_code == 200:
            return response.text
        else:
            return None

    def write_data_index(self, response):
        file_name = "贴吧.html"
        with open("./贴吧/" + file_name, "a", encoding="utf-8") as f:
            f.write(response)
            print("保存成功")

    def run(self):
        response = self.get_data_index()
        self.write_data_index(response)

if __name__ == '__main__':
    sr = YieBao_Spider()
    sr.run()