Python Selenium Web驱动程序无法在Instagram的弹出页面上找到元素



首先,很抱歉我的编码很糟糕,我不是任何类型的编码器。

我像一年前一样创建了(复制了xd)一个Instagram机器人,直到两个月前它还运行得很好。我的Instagram机器人的目标是为我的主账户识别新的关注者和取消关注者。我不做快速关注和取消关注。问题是,当我在Instagram上打开以下弹出窗口时,selenium找不到我指定的任何元素。我尝试过使用XPATH、CSS Selector、类名和所有这些方法。但在打开弹出页面后,我甚至无法点击关闭按钮,代码无法找到按钮。你们有什么想法或建议吗?

last_ht, ht = 0, 1
WebDriverWait(self.browser, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class=_aano]")))
scroll_box = self.browser.find_element_by_xpath("//div[@class=_aano]")
while last_ht != ht:
last_ht = ht
time.sleep(2.5)
ht = self.browser.execute_script(
"arguments[0].scrollTo(0, arguments[0].scrollHeight);"
"return arguments[0].scrollHeight;", scroll_box)

上面的代码应该等待你的个人资料页面上的Following按钮,然后点击它(在此之前没有任何问题),然后等待弹出窗口加载,然后滚动,但WebDriverWait函数会引发一个错误,这意味着代码找不到元素,但就像我可以看到的一样。它会等待10秒。

我试过Chrome和Firefox,但Mozilla的情况更糟,它在个人资料页面上找不到Followings按钮。

由于您还没有共享DOM的适用部分,我的最佳猜测是您需要交互的元素位于iframe中。要与iframe内的组件交互,必须首先切换到iframe(这意味着您需要为iframe编写一个定位器,然后执行其余代码。

last_ht, ht = 0, 1
# you must provide the xpath string for the iframe
driver.switch_to.frame(driver.find_element_by_xpath("..."))
WebDriverWait(self.browser, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class=_aano]"))) 
scroll_box = self.browser.find_element_by_xpath("//div[@class=_aano]")
while last_ht != ht:
last_ht = ht
time.sleep(2.5)
ht = self.browser.execute_script(
"arguments[0].scrollTo(0, arguments[0].scrollHeight);"
"return arguments[0].scrollHeight;", scroll_box)
# the rest of your code

完成iframe中的组件后,必须切换回父框架。

driver.switch_to.parent_frame()

或者切换到顶部窗口

driver.switch_to.default_content()

按这个顺序试试。我相信第一个对你有用。

我的Instagram机器人的目标是为我的主账户识别新的关注者和取消关注者

所以你应该点击"追随者";按钮而不是";下面的";按钮,就像你在这里说的。

上面的代码应该等待您的配置文件页面上的"跟随"按钮

因此,假设这就是您所需要的,此代码将帮助您向下滚动";追随者";弹出窗口。我把整个代码放在这里,因为我不知道你的代码是否点击了";追随者";按钮。此外,

last_ht, ht = 0, 1
while last_ht != ht:
last_ht = ht

部分将使您的向下滚动操作只运行一次,非常奇怪的是,他们使用3行代码无所事事。只要删除那个部分,代码就会做和以前完全相同的事情。所以我在这里使用for循环。

使用代码需要更改的内容:

  • 将您的用户名和密码放在以下两行中:

INS_EMAIL=";youremail@gmail.com"INS_PASSWORD=";您的密码">

  • 修复此行中到ins帐户链接的链接:

self.driver.get("https://www.instagram.com/geeks_for_geeks/")

  • 更改"追随者";至";下面的";取决于您的用例:
followers = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((
By.PARTIAL_LINK_TEXT,
'followers')))
  • 我使用了100次for循环,但如果你想滚动到文件末尾,我想我以后可以更改它。

  • 下次你应该发布更长的代码,这样我们就可以了解其他部分是否正常工作。

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
# ------------ CONSTANTS ------------- #
INS_EMAIL = 'youremail@gmail.com'
INS_PASSWORD = 'yourpassword'
INS_URL = 'https://instagram.com'

class InstaFollower:
def __init__(self):
s = Service(ChromeDriverManager().install())
self.driver = webdriver.Chrome(service=s)
def login(self):
self.driver.get(INS_URL)
time.sleep(3)
username_input_tag = WebDriverWait(self.driver,
10).until(EC.presence_of_element_located((By.XPATH,
"//input[@name='username']")))
username_input_tag.send_keys(INS_EMAIL)
password_input_tag = WebDriverWait(self.driver,
10).until(EC.presence_of_element_located((By.XPATH,
"//input[@name='password']")))
password_input_tag.send_keys(INS_PASSWORD)
password_input_tag.send_keys(Keys.ENTER)
def find_followers(self):
time.sleep(2)
self.driver.get('https://www.instagram.com/geeks_for_geeks/')
# change the link above to your instagram link
time.sleep(3)
followers = WebDriverWait(self.driver,
10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT,
'followers')))
# The line above is optional, you can change followers to following
followers.click()
time.sleep(3)
try:
popup = self.driver.find_element(By.CSS_SELECTOR, '._aano')
except:
print 'FAILED TO FIND POPUP ELEMENT'
else:
print 'Popup element is found'
for run in range(100):
print(f"scrolling down {run}")
self.driver.execute_script('arguments[0].scrollTop = arguments[0].scrollHeight'
, popup)
time.sleep(2)

insta_follower_bot = InstaFollower()
insta_follower_bot.login()
time.sleep(2)
insta_follower_bot.find_followers()

我很想知道你的结果,因为我目前正在做类似的项目。

增加了很多时间。sleep,因为图书馆的互联网太糟糕了。

最新更新