python - 使用 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()
解决方案
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 !!
推荐阅读
- r - 如何按组执行成对统计检验?
- node.js - Heroku - “没有网络进程正在运行”消息,但服务器已经启动
- debian-buster - 如何在 debian 10 上安装 AMD radeon PRO WX 4100 的驱动程序?
- python - 多个 Python 绘图未在其他子图中显示绘图
- android - Android动态功能卡在安装视图虽然它说它已安装
- c# - 将按钮绑定到子组件 blazor
- c - C中的FILENAME_MAX和PATH_MAX有什么区别吗?
- node.js - 是什么导致在docker中使用节点出现以下错误
- php - PDO $_GET 当用户单击该任务的删除按钮时删除数据库中特定任务的任务ID
- python - Plotly:如何为具有完全不同数据和布局的图形制作一个绘图下拉菜单?