我正在尝试构建一个网络抓取工具,使我可以抓取Instagram上帖子的“喜欢”的名字。我能够自动执行该程序,以打开instagram,登录,转到帖子并打开“被(n)个其他人喜欢”列表。
然后是下面的代码,目的是刮擦喜欢者的名字。由于一次只显示最喜欢的11个人,其余的只有在滚动后才会显示(这会触发AJAX请求,正如我从遇到类似问题的其他人那里读到的那样),因此我编写了这段代码,应该将第一个11个名称,将它们附加到列表中,打印出来,然后滚动。
no_of_pagedowns = 5
while no_of_pagedowns:
liker_list = []
likers = driver.find_elements_by_class_name("qyrsm")
for n in likers:
#scrape the name of the likers
liker = n.find_element_by_class_name("_4EzTm").get_attribute("textContent")
liker_list.append(liker)
no_of_pagedowns -= 1
print(liker_list)
time.sleep(1)
driver.find_element_by_xpath('/html/body/div[4]/div/div[2]/div/div')
#scrollcode
driver.execute_script("javascript:window.scrollBy(0,660)")
它可以工作,并且可以返回前十一个“喜欢”的人的名字,但是不会滚动。我认为问题在于代码未能将重点放在正确的元素上,但是我未能找出我应该关注的元素。它只给相同的11个人五次。我也尝试过从
替换“滚动代码” driver.execute_script("javascript:window.scrollBy(0,660)")
类似
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
或
elem.send_keys(Keys.PAGE_DOWN)
where elem = driver.find_element_by_xpath('/html/body/div[4]/div/div[2]/div/div')
我也尝试过这段代码:
no_of_pagedowns = 5
while no_of_pagedowns:
liker_list = []
likers = driver.find_elements_by_class_name("qyrsm")
for n in likers:
#scrape the name of the likers
liker = n.find_element_by_class_name("_4EzTm").get_attribute("textContent")
liker_list.append(liker)
no_of_pagedowns -= 1
print(liker_list)
time.sleep(1)
driver.find_element_by_xpath('/html/body/div[4]/div/div[2]/div/div').click()
driver.execute_script("window.scrollBy(0, 660);")
我在找到元素后放了一个.click(),因为我认为可能需要单击以关注“喜欢列表”,并且实际上使滚动发生了。但是现在又出现了另一个问题:无论我输入y cood的值如何,每个循环仅向下滚动1个喜欢的人,而在第5个循环时,它失败了,因为它将单击从顶部开始计数的第6个喜欢的人,导致到第6个赞者的个人资料页面。
我已经在这个滚动问题上停留了将近一个星期。我在Google上搜索并阅读了很多人的类似问题,但找不到一个有帮助的问题。非常感谢任何可以提供帮助的人。
我不确定您要寻找的是什么,但这是当我们遇到滚动问题时在Java中尝试过的方法。该元素不会自动滚动到视图中,并且会滚动设置数量的对象,因此我们在下面的代码中编写了代码
public static void scrollintoView(WebDriver driver, String Value) throws
InterruptedException {
int totalAttempts = 30;
while (totalAttempts > 0) {
totalAttempts = totalAttempts-1;
try { // checks code for exceptions
WebElement ele= driver.findElement(By.xpath(Value));
break; // if no exceptions breaks out of loop
}
catch (org.openqa.selenium.NoSuchElementException e) {
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("window.scrollBy(0, 300)");
continue; // continues to loop if exception is found
}}
}
您可以在python中尝试类似的操作,硬滚动可以设置每次滚动时要检查的用户数。让我知道这是否有帮助