首页 > 解决方案 > 使用 selenium 驱动程序和 Instagram 登录查找元素的问题

问题描述

我正在尝试制作一个程序来抓取我所有的追随者,然后基本上可以将其存储到字典中,其中键作为我的追随者名称,值作为追随者总数,然后对字典进行排序以找到我的前 5 或 10 个最关注的追随者. 但是,当我尝试登录 Instagram 时,出现此错误:

DevTools listening on ws://127.0.0.1:49683/devtools/browser/0e7b8ef3-8f6b-48fd-87a6-ce61c11decf6
Traceback (most recent call last):
  File "c:\Users\mathe\OneDrive\Documents\Data analysis\Python\InstagramAnalyzer\main.py", line 93, in <module>
    login(driver)
  File "c:\Users\mathe\OneDrive\Documents\Data analysis\Python\InstagramAnalyzer\main.py", line 22, in login
    driver.find_element_by_xpath("//div/input[@name='username']").send_keys(username)
  File "C:\Users\mathe\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Users\mathe\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "C:\Users\mathe\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Users\mathe\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div/input[@name='username']"}
  (Session info: headless chrome=92.0.4515.159)

我的当前代码(密码和用户名已被移出,但这不是问题,因为我已经确认它是正确的密码和用户名)

import time
from selenium import webdriver as wd
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# The account you want to check
account = "xxx"

def login(driver):
    username = "xxx"   # Your username
    password = "XXX"   # Your password

    # Load page
    driver.get("https://www.instagram.com/accounts/login/")
    
    # Login
    driver.find_element_by_xpath("//div/input[@name='username']").send_keys(username)
    driver.find_element_by_xpath("//div/input[@name='password']").send_keys(password)
    driver.find_element_by_xpath("//span/button").click()
    
    key = input("Enter activation code:")
    driver.find_element_by_xpath("//div/input[@name='key']").send_keys(key)
    driver.find_element_by_xpath("//span/button").click()

    # Wait for the login page to load
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.LINK_TEXT, "See All")))


def scrape_followers(driver, account):
    # Load account page
    driver.get("https://www.instagram.com/{0}/".format(account))

    # Click the 'Follower(s)' link
    driver.find_element_by_partial_link_text("follower").click()

    # Wait for the followers modal to load
    xpath = "/html/body/div[4]/div/div/div[2]/div/div[2]"
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, xpath)))

    SCROLL_PAUSE = 0.5  # Pause to allow loading of content
    driver.execute_script("followersbox = document.getElementsByClassName('_gs38e')[0];")
    last_height = driver.execute_script("return followersbox.scrollHeight;")

    # We need to scroll the followers modal to ensure that all followers are loaded
    while True:
        driver.execute_script("followersbox.scrollTo(0, followersbox.scrollHeight);")

        # Wait for page to load
        time.sleep(SCROLL_PAUSE)

        # Calculate new scrollHeight and compare with the previous
        new_height = driver.execute_script("return followersbox.scrollHeight;")
        if new_height == last_height:
            break
        last_height = new_height

    # Finally, scrape the followers
    xpath = "/html/body/div[4]/div/div/div[2]/div/div[2]/ul/li"
    followers_elems = driver.find_elements_by_xpath(xpath)

    followers_temp = [e.text for e in followers_elems]  # List of followers (username, full name, follow text)
    followers = []  # List of followers (usernames only)

    # Go through each entry in the list, append the username to the followers list
    for i in followers_temp:
        username, sep, name = i.partition('\n')
        followers.append(username)

    print("===================================")
    print("FOLLOWERS")

    return followers


if __name__ == "__main__":
    
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.binary_location = "C:\Program Files\Google\Chrome\Application\chrome.exe"

    driver = webdriver.Chrome(executable_path=r'C:/Users/mathe/OneDrive/Documents/chromedriver_win32/chromedriver.exe', options=options)
    
    # driver = wd.Chrome(driver_binary, chrome_options=options)
    
    try:
        login(driver)
        followers = scrape_followers(driver, account)
        print(followers)
    finally:
        driver.quit()

标签: pythonseleniumselenium-webdriverselenium-chromedriver

解决方案


from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManager
import time

driver = webdriver.Chrome(executable_path=r'your chrome driver path') 

driver.get("https://www.instagram.com")
time.sleep(3)

element = driver.find_element_by_xpath("//input[@name='username']")
username = input("Enter Username")
element.send_keys(username)

element = driver.find_element_by_xpath("//input[@name='password']")
password = input("Enter Password")
element.send_keys(password)

element.send_keys(Keys.RETURN)

Hope this helps !!


推荐阅读