在python

时间:2018-09-09 12:34:41

标签: python selenium element

直到现在,我使用for循环使用此脚本在某个路径中获取页面上的所有元素:

for username in range(range_for_like):

    link_username_like = "//article/div[2]/div[2]/ul/div/li[" + str(num) + "]/div/div[1]/div/div[1]/a[contains(@class, 'FPmhX notranslate zsYNt ')]"
    user = browser.find_element_by_xpath(link_username_like).get_attribute("title")
    num += 1
    sleep(0.3)

但是有时候我的cpu超过100%,这不是很好。

因此,我认为使用find_elements_by_xpath在一行中查找所有元素是一个更好的主意,但是这样我无法弄清楚如何获取所有的“ title”属性。

我知道每个标题//article/div[2]/div[2]/ul/div/li[" + str(num) + "]/div/div[1]/div/div[1]/a的路径都会改变,这就是为什么我不断增加num变量的原因,但是如何在没有循环的情况下使用该技术?

就性能而言,获得所有属性的最有效方法是什么?我不在乎是否也需要2分钟或更长时间

1 个答案:

答案 0 :(得分:1)

在这里,您可以通过xpath吸引所有喜欢您照片的人:

//div[text()='Likes']/..//a[@title]

下面的代码获得第一个12个赞:

likes = browser.find_elements_by_xpath("//div[text()='Likes']/..//a[@title]")
for like in likes:
    user = like.get_attribute("title")

要获得所有喜欢,您必须滚动,为此,您可以得到自己拥有的全部喜欢,然后滚动直到所有喜欢被加载。要获得完全喜欢,您可以使用//a[contains(.,'likes')]/span xpath并将其转换为整数。

要滚动,请使用javascript .scrollIntoView()持续播放,最终代码如下:

totalLikes = int(browser.find_element_by_xpath("//a[contains(.,'likes')]/span").text)
browser.find_element_by_xpath("//a[contains(.,'likes')]/span").click()

while true:
   likes=browser.find_elements_by_xpath("//div[text()='Likes']/..//a[@title]")
   likesLen = len(likes)
   if (likesLen == totalLikes - 1)
       break
   browser.execute_script("arguments[0].scrollIntoView()", likes.get(likesLen-1))

for like in likes:
    user = like.get_attribute("title")

工作原理: 通过//div[text()='Likes'],我发现窗口包含赞的唯一div。然后要获得li的所有喜欢,我使用div选择器转到父项/..,然后使用a属性获得所有title。由于所有人都喜欢不立即加载,因此您必须向下滚动。为此,我在点击喜欢之前获得了总喜欢数量。比我滚动到最后一个赞(a[@title])强制instagram加载一些数据,直到总赞不等于喜欢列表。滚动完成后,我只遍历列表中所有喜欢的东西,而我进入while循环并获得标题。