我正在尝试抓取给定Instagram用户的以下列表。这需要使用Selenium导航到用户的Instagram页面,然后单击“关注”。但是,我似乎无法点击Selenium的“关注”按钮。
Use Single Transaction
然而,这导致driver = webdriver.Chrome()
url = 'https://www.instagram.com/beforeeesunrise/'
driver.get(url)
driver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/header/div[2]/ul/li[3]/a').click()
。我从html复制了xpath,尝试使用类名,部分链接和完整链接,似乎无法让它工作!我还确保上面的xpath包含带有“click”事件监听器的元素。
更新:通过登录我能够获得上述信息。但是(!),现在我无法得到“跟随”的结果列表。当我点击带有驱动程序的按钮时,html不包含您在Instagram上看到的弹出对话框中的信息。我的目标是让所有用户都遵循给定的用户名。
答案 0 :(得分:1)
尝试使用其他XPath。我已经确认这在页面上是唯一的。
driver.find_element_by_xpath("//a[contains(.,'following')]")
答案 1 :(得分:1)
答案 2 :(得分:0)
从网页抓取的角度来看,selenium
的主要目标不是提供丰富的功能,而是在页面上查找元素,因此更好的选择是将此任务委派给特定工具,像BeautifulSoup。在我们找到我们正在寻找的内容之后,我们可以要求selenium
与该元素进行互动。
selenium
和BeautifulSoup
之间的桥梁将是我发现here之下的这个惊人的功能。该函数获取一个BeautifulSoup
元素,并生成一个我们可以在selenium
上使用的唯一XPATH。
import os
import re
from selenium import webdriver
from bs4 import BeautifulSoup as bs
import itertools
def xpath_soup(element):
"""
Generate xpath of soup element
:param element: bs4 text or node
:return: xpath as string
"""
components = []
child = element if element.name else element.parent
for parent in child.parents:
"""
@type parent: bs4.element.Tag
"""
previous = itertools.islice(parent.children, 0, parent.contents.index(child))
xpath_tag = child.name
xpath_index = sum(1 for i in previous if i.name == xpath_tag) + 1
components.append(xpath_tag if xpath_index == 1 else '%s[%d]' % (xpath_tag, xpath_index))
child = parent
components.reverse()
return '/%s' % '/'.join(components)
driver = webdriver.Chrome(executable_path=YOUR_CHROMEDRIVER_PATH)
driver.get(url = 'https://www.instagram.com/beforeeesunrise/')
source = driver.page_source
soup = bs(source, 'html.parser')
button = soup.find('button', text=re.compile(r'Follow'))
xpath_for_the_button = xpath_soup(button)
elm = driver.find_element_by_xpath(xpath_for_the_button)
elm.click()
(但您需要编写一些代码才能使用帐户登录)