在 python 中使用 selenium 获取所有属性 "title"
Get all the attributes "title" with selenium in python
到目前为止,我使用 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
在一行中查找所有元素,但在这样做时,我不知道如何获取所有“标题”属性。
我知道每个标题的路径都会改变,//article/div[2]/div[2]/ul/div/li[" + str(num) + "]/div/div[1]/div/div[1]/a
这就是为什么我不断增加 num
变量的原因,但是我如何在没有循环的情况下使用这种技术?
在性能方面获取所有属性的最有效方法是什么?我不介意它是否也需要 2 分钟或更长时间
这里是你如何通过 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()
到 last like,最终代码如下所示:
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 和 window 包含喜欢。然后为了获得所有喜欢的 li
,我使用 /..
选择器转到 parent div
,然后使用 title
属性获得所有 a
。因为所有人都喜欢不立即加载,所以您必须向下滚动。为此,我在点击喜欢之前获得了总喜欢数量。然后我滚动到最后一个点赞 (a[@title]
) 以强制 instagram 加载一些数据,直到我得到的点赞总数不等于点赞列表。当滚动完成时,我只是迭代将所有喜欢的东西扔到我在 while 循环中得到的列表中并获得标题。
到目前为止,我使用 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
在一行中查找所有元素,但在这样做时,我不知道如何获取所有“标题”属性。
我知道每个标题的路径都会改变,//article/div[2]/div[2]/ul/div/li[" + str(num) + "]/div/div[1]/div/div[1]/a
这就是为什么我不断增加 num
变量的原因,但是我如何在没有循环的情况下使用这种技术?
在性能方面获取所有属性的最有效方法是什么?我不介意它是否也需要 2 分钟或更长时间
这里是你如何通过 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()
到 last like,最终代码如下所示:
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 和 window 包含喜欢。然后为了获得所有喜欢的 li
,我使用 /..
选择器转到 parent div
,然后使用 title
属性获得所有 a
。因为所有人都喜欢不立即加载,所以您必须向下滚动。为此,我在点击喜欢之前获得了总喜欢数量。然后我滚动到最后一个点赞 (a[@title]
) 以强制 instagram 加载一些数据,直到我得到的点赞总数不等于点赞列表。当滚动完成时,我只是迭代将所有喜欢的东西扔到我在 while 循环中得到的列表中并获得标题。