__init__中的Python 3 NameError,未定义“会话”

时间:2018-07-25 23:37:16

标签: python python-requests

我正在一个小项目上,该项目获得了给定用户Instagram的关注。我可以像使用函数一样完美地运行此脚本,但是我计划将其制作成实际的程序,因此我决定编写一个类。我相信我在所有正确的地方都正确使用了“自我”,但是我看不到为什么出现此名称错误。这是我的代码:

# Library imports
import requests
import json
import time

# Class decleration
class NodesCursor:

    # Class variables

    # Login url
    LOGIN_URL = 'https://www.instagram.com/accounts/login/ajax/'

    # Referer url
    REFERER_URL = 'https://www.instagram.com/accounts/login/'

    # User agent
    USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'

    # Class constructor
    def __init__(self, USERNAME, PASSWD):

        # Login username
        self.USERNAME = USERNAME

        # Login password
        self.PASSWD = PASSWD

        # Creating a session
        self.session = requests.Session()

        # Get request to login url
        self.req = session.get(LOGIN_URL)

        # Setting user agent for session header
        self.session.headers = {'user-agent': USER_AGENT}

        # Setting referer url for session header
        self.session.headers.update({'Referer': REFERER_URL})

        # Updating session header with x-csrftoken cookie
        self.session.headers.update({'x-csrftoken': self.req.cookies['csrftoken']})

        # Login data for website
        self.login_data = {'username': self.USERNAME, 'password': self.PASSWD}

        # Login with a post requests
        self.login = session.post(LOGIN_URL, data=self.login_data, allow_redirects=True)

        # Updating the session with x-csrftoken cookie
        self.session.headers.update({'x-csrftoken': self.login.cookies['csrftoken']})

    # Function to parse following
    def parse(self):

        # An array of usernames
        usernames = []

        # Variable to handle continuous scrolling
        has_next_page = True

        # Variable to handle continuous scrolling
        end_cursor = None

        # Loop to handle the scrolling to get the needed data
        while has_next_page == True:

            # Sleep for 30 seconds to not get rate limited
            #time.sleep(30)

            # Query url
            queryUrl = "https://www.instagram.com/graphql/query/"

            # Parameters for the get request
            payload = {"query_hash":"9335e35a1b280f082a47b98c5aa10fa4", "id":"8164444379","first":24, "after": end_cursor}

            # Variable for GETting all of the user's following
            following = self.session.get(queryUrl, params=payload).json()

            # Parsing the node to check to see what has_next_page equals to
            has_next_page = following['data']['user']['edge_follow']['page_info']['has_next_page']

            # Parse all user followings until there are no more
            if has_next_page == True or has_next_page == False:

                # Parsing end cursor id
                end_cursor = following['data']['user']['edge_follow']['page_info']['end_cursor']

                # Sleep for 30 seconds to not get rate limited
                time.sleep(30)

                # Parsing to get to username node
                userList = following['data']['user']['edge_follow']

                # Loop to interate through all of the names
                for eachName in userList['edges']:

                    # Add each name to the array
                    usernames.append(eachName['node']['username'])

        # Print the array of usernames, along with the length
        print(usernames)
        print(len(usernames))

if __name__ == '__main__':
    checkFollowing = NodesCursor('username', 'password')
    checkFollowing().parse()

错误:

Traceback (most recent call last):
  File "test.py", line 115, in <module>
    turboOne = NodesCursor('moola.ig', 'yeet1234')
  File "test.py", line 42, in __init__
    self.req = session.get(LOGIN_URL)
NameError: name 'session' is not defined

尽管如前所述,我认为我正确地使用了“自我”,但是这可能是我的错误出处,但我不确定。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

访问self.时,您缺少session

# Creating a session
self.session = requests.Session()

# Get request to login url
self.req = self.session.get(LOGIN_URL)

要修复LOGIN_URL的错误:

self.req = self.session.get(NodesCursor.LOGIN_URL)

答案 1 :(得分:0)

尝试更换

self.req = session.get(LOGIN_URL)

使用

self.req = self.session.get(LOGIN_URL)