我试图在Instagram帖子页面中获取关注按钮文字(页面示例 - https://www.instagram.com/p/BD2C8pQwO8X/)
driver = webdriver.Chrome()
driver.set_window_size(1024, 768)
driver.get('https://www.instagram.com/accounts/login/')
driver.implicitly_wait(10)
username_field = driver.find_element_by_name('username')
password_field = driver.find_element_by_name('password')
username_field.send_keys(user_login)
password_field.send_keys(user_pass)
password_field.send_keys(Keys.RETURN)
time.sleep(5)
def find_tag():
search_field = driver.find_element_by_xpath('//nav/div/div/div/div/input')
search_field.send_keys('#moscow')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="react-root"]/section/nav/div/div/div/div[1]/div[2]/div[2]/div/a[1]').click()
def follow_from_tag():
top_20_posts = driver.find_elements_by_xpath('//article/div/div/div/a')
for post in top_20_posts:
post.click()
time.sleep(1.5)
print(driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/article/header/span/button').text)
find_tag()
time.sleep(2)
follow_from_tag()
但收到了错误:
selenium.common.exceptions.WebDriverException: Message: unknown error: Element is not clickable at point (511, 415). Other element would receive the click: <a class="_c2kdw" href="javascript:;" role="button" data-reactid=".1.1.0.0.1.$https=2//scontent-arn2-1=1cdninstagram=1com/t51=12885-15/e15/12479233_260398184295103_1013244176_n=1jpg?ig_cache_key=0MTIyMjM0Nzg4MzM1MDYzNTQzOA%3D%3D=12.0.0.1"></a>
(Session info: chrome=49.0.2623.110)
(Driver info: chromedriver=2.9.248307,platform=Mac OS X 10.10.5 x86_64
我做错了什么?
答案 0 :(得分:1)
这可以得到你想要的东西:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def wait(dr, x):
element = WebDriverWait(dr, 5).until(
EC.presence_of_element_located((By.XPATH, x))
)
return element
driver = webdriver.Chrome()
driver.set_window_size(1024, 768)
driver.get('https://www.instagram.com/accounts/login/')
driver.implicitly_wait(10)
username_field = driver.find_element_by_name('username')
password_field = driver.find_element_by_name('password')
username_field.send_keys("user")
password_field.send_keys("pass")
password_field.send_keys(Keys.RETURN)
def find_tag():
search_field = driver.find_element_by_xpath('//nav/div/div/div/div/input')
search_field.send_keys('moscow')
wait(driver, '//*[@id="react-root"]/section/nav/div/div/div/div[1]/div[2]/div[2]/div/a[1]').click()
def follow_from_tag():
top_20_posts = [a.get_attribute("href") for a in
driver.find_elements_by_xpath("//a[contains(@href,'?tagged=moscow')]")[:20]]
for href in top_20_posts:
driver.get(href)
print(href)
btn = wait(driver, "//button[text()='Follow']")
# btn.click() # uncomment to follow
印刷品的输出:
https://www.instagram.com/p/BD249tsxEbl/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2puxzELOu/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2jrmyP8ec/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2v9NyvzIs/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2qkcZm8cg/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2sEWzLlEF/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD25VA2vI6t/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2fRXoB1t2/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2jYlfE0Yw/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2s0PtoRP1/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2mn_QBQPK/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2zTmqM-5h/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2q6Qfqc5q/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2iivvDbiO/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2-WU2msdO/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2Qa2Rn0GV/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2ffCZDR8L/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2kqDhwywb/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2r4M7lf-h/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2t3PTAlJC/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
您可能希望添加错误处理并使用更好的xpath,但它可以满足您的需求,如果您想要关注,只需取消注释btn.click()
。
我想念你想查看文字,如果你想查看文字,我们可以使用包含"Follow"
作为要匹配的单词:
def follow_from_tag():
top_20_posts = [a.get_attribute("href") for a in
driver.find_elements_by_xpath("//a[contains(@href,'?tagged=moscow')]")[:20]]
for href in top_20_posts:
driver.get(href)
print(href)
btn = wait(driver, "//button[contains(text(),'Follow')]")
print(btn.text)
我随机选择一个后跟输出:
https://www.instagram.com/p/BD23RGrkLEN/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2jrmyP8ec/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD249tsxEbl/?tagged=moscow
FOLLOWING
https://www.instagram.com/p/BD2v9NyvzIs/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2qkcZm8cg/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2sEWzLlEF/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD25VA2vI6t/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2fRXoB1t2/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2s0PtoRP1/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2jYlfE0Yw/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2mn_QBQPK/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2zTmqM-5h/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2-WU2msdO/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2q6Qfqc5q/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2iivvDbiO/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD29pcrDs6o/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2Qa2Rn0GV/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2ffCZDR8L/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2kqDhwywb/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2r4M7lf-h/?tagged=moscow
FOLLOW
所以你只需要一个if btn.text.lower() == "follow"
等..
答案 1 :(得分:0)
您发布的网址不包含//*[@id="react-root"]/section/nav/div/div/div/div[1]/div[2]/div[2]/div/a[1]
。但是我假设当将(虚拟)鼠标光标从你的search_field
移动到你想要点击的元素时,它会在页面上产生一些MouseOver效果,从某种意义上说是一个覆盖物弹出或隐藏可点击的东西背后的元素。
我遇到了同样的问题,并解决了这个问题: How to avoid MouseOver on Selenium Click()