【问题标题】:Scrolling web page using selenium python webdriver使用 selenium python webdriver 滚动网页
【发布时间】:2014-11-10 07:53:48
【问题描述】:

我正在抓取此网页以获取滚动后加载用户的用户名

页面网址:“http://www.quora.com/Kevin-Rose/followers

我知道页面上的用户数(在本例中为 43812) 如何滚动页面直到加载所有用户? 我在互联网上搜索了相同的内容,并且在任何地方我都得到了几乎相同的代码行,即:

driver.execute_script("window.scrollTo(0, )")

如何确定垂直位置以确保所有用户都已加载?有没有其他选项可以在不实际滚动的情况下实现相同的目标?

   from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import urllib

driver = webdriver.Firefox()
driver.get('http://www.quora.com/')
time.sleep(10)

wait = WebDriverWait(driver, 10)

form = driver.find_element_by_class_name('regular_login')
time.sleep(10)
#add explicit wait

username = form.find_element_by_name('email')
time.sleep(10)
#add explicit wait

username.send_keys('abc@gmail.com')
time.sleep(30)
#add explicit wait

password = form.find_element_by_name('password')
time.sleep(30)
#add explicit wait

password.send_keys('def')
#add explicit wait

password.send_keys(Keys.RETURN)
time.sleep(30)

#search = driver.find_element_by_name('search_input')
search = wait.until(EC.presence_of_element_located((By.XPATH, "//form[@name='search_form']//input[@name='search_input']")))

search.clear()
search.send_keys('Kevin Rose')
search.send_keys(Keys.RETURN)

link = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "Kevin Rose")))
link.click()
#Wait till the element is loaded (Asynchronusly loaded webpage)

handle = driver.window_handles
driver.switch_to.window(handle[1])
#switch to new window 

element = WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Followers")))
element.click()

【问题讨论】:

  • 当然有选择。请显示您现在拥有的完整代码(包括滚动部分)。谢谢。
  • 我认为它没有任何用处,但我已经添加了代码。这只是登录网站并导航到特定页面的代码。不知道在y坐标位置加什么?

标签: python python-2.7 selenium selenium-webdriver web-scraping


【解决方案1】:

由于在加载最后一个关注者存储桶后没有什么特别的出现,我将依赖这样一个事实,即您知道用户有多少关注者并且您知道每次向下滚动时加载了多少(我已经检查过 -每卷 18 个)。因此,您可以计算需要向下滚动页面多少次。

这是实现(我使用了一个只有 53 个关注者的不同用户来演示解决方案):

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

followers_per_page = 18

driver = webdriver.Chrome()  # webdriver.Firefox() in your case
driver.get("http://www.quora.com/Andrew-Delikat/followers")

# get the followers count
element = WebDriverWait(driver, 2).until(EC.presence_of_element_located((By.XPATH, '//li[contains(@class, "FollowersNavItem")]//span[@class="profile_count"]')))
followers_count = int(element.text.replace(',', ''))
print followers_count

# scroll down the page iteratively with a delay
for _ in xrange(0, followers_count/followers_per_page + 1):
    driver.execute_script("window.scrollTo(0, 10000);")
    time.sleep(2)

另外,你可能需要根据循环变量增加这个10000 Y 坐标值,以防有大量关注者。

【讨论】:

  • 非常感谢!!现在我正在尝试以下脚本,它似乎可以完美运行 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  • ^不。我上面提到的代码没有加载所有用户。
  • @Siddhesh 感谢您提出另一个有趣的挑战。抱歉,我不太明白 - 它对你有用吗?
  • 是的,它奏效了。再次感谢您付出了这么多努力。
猜你喜欢
  • 2023-03-12
  • 2014-01-26
  • 1970-01-01
  • 2020-01-15
  • 2015-06-28
  • 2019-02-10
  • 1970-01-01
  • 2018-09-20
相关资源
最近更新 更多