直到现在,我使用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分钟或更长时间
答案 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循环并获得标题。