javascript - 在python selenium中使用ajax加载数据时如何滚动div

标签 javascript python selenium selenium-webdriver web-scraping

我正在窗口 8 中使用 chrome webdriver 开发 python selenium。我遇到了 page在使用 ajax 滚动时加载数据。我尝试注入(inject) jquery以下链接对我不起作用。 Link 1 Link 2 Link 3

谁能给我一条正确的道路。

编辑----------------

这是我在 alecxe 回答后的部分代码

    nam = driver.find_element(By.CLASS_NAME ,'_wu')

    #get length of review
    revcnt = driver.find_element(By.XPATH ,"//span[@class='_Mnc _yz']")
    revcnt = int(revcnt.text.replace(" reviews","").strip())
    print revcnt
    # wait for reviews to appear
    wait = WebDriverWait(driver, 10)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.review-snippet")))
    #reviews=[]
    while True:
        reviews = driver.find_elements_by_css_selector("div._ju")
        if len(reviews)<revcnt:
            driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])
        else:
            driver.quit()
        print len(reviews)

但是从 while 循环中逃脱的问题!

我试过了 it .

最佳答案

做一个循环,在每次迭代时滚动到 View 列表中的最后一个“评论”(对我有用):

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

driver = webdriver.Chrome()
driver.get("https://www.google.com/search?q=a1%20plumbing%20boise&gws_rd=ssl#gws_rd=ssl&lrd=0x54aeff4cb0b24461:0x23720b81e2bed658,1")

# wait for reviews to appear
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.review-snippet")))

while True:
    reviews = driver.find_elements_by_css_selector("div._ju")
    driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])

请注意,这里的循环是无限的——您需要弄清楚如何退出循环。例如,您可以计算滚动到 View 之前和之后的评论数,如果没有加载更多评论,则退出循环。或者,您可以检查旋转的圆圈是否存在。一旦它没有显示在滚动条上 - 这意味着不再需要加载评论。

这是检测没有更多评论要加载的想法之一 - 检查下一次滚动后评论对话框的滚动高度是否没有改变 - 这接近于人类检测它的方式:

dialog = driver.find_element_by_css_selector("div.review-dialog-list")
last_scroll_height = 0

while True:
    reviews = driver.find_elements_by_css_selector("div._ju")
    driver.execute_script("arguments[0].scrollIntoView();", reviews[-1])

    # adding artificial delay (don't tell anyone I'm using sleep here)
    time.sleep(1)

    # if scroll height has not changed - exit
    scroll_height = driver.execute_script("return arguments[0].scrollHeight;", dialog)
    if scroll_height == last_scroll_height:
        break
    else:
        last_scroll_height = scroll_height

print(len(reviews)) 

我不喜欢这里有 time.sleep(),希望你有更好的主意来解决这个问题。

关于javascript - 在python selenium中使用ajax加载数据时如何滚动div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32619106/

相关文章:

javascript - 在颜色标签顶部显示所选颜色的代码

javascript - 如何返回javascript数组中的所有对象

python - 如何使用反射和描述性语法覆盖 sqlalchemy 中的列名

javascript - 如何使用 jquery 的 $ajax 调用进行 REST 调用?

javascript - hasOwnProperty 和对象的属性访问

python - 将 HOG+SVM 训练应用于网络摄像头以进行目标检测

Python - sys.stderr 未保存到 .txt 或 .log

python - 如何在 python 中正确关闭 Selenium WebDriver 实例?

python - 类型错误:write() 参数必须是 str,而不是 bytes,UTF-16

java - Selenium webdriver 使用相对路径上传下载文件