首页 > 解决方案 > 使用硒获取 li 数据的快速方法?

问题描述

感谢您查看这篇文章。

我试图获得有关新闻的评论。其中一条新闻有大约 11k 条评论,其中大约有 6k 条评论能够收集。这是链接:https ://n.news.naver.com/mnews/article/comment/023/0003390153?sid=102 (虽然是韩文页面,但对你来说无所谓。)

您可能会注意到这是一个移动版网页,您需要使用

driver.find_element_by_xpath("//span[@class='u_cbox_page_more']").click()

直到它显示完整的评论。

问题是,我选择获取数据的方式很慢。花了一个多小时,我不得不打断它。这是我使用的代码。

content = []
name = []
r_time = []

comment_list = driver.find_elements_by_xpath("//ul[@class='u_cbox_list']/li")
              
for comment in comment_list:
    try:
        con = comment.find_element_by_xpath(".//span[@class='u_cbox_contents']").text
        content.append(con)
    except NoSuchElementException:
        continue

    name.append(comment.find_element_by_xpath(".//span[@class='u_cbox_nick']").text)        
    r_time.append(comment.find_element_by_xpath(".//span[@class='u_cbox_date']").text)

我有更多新闻要抓取,我不能冒险坐下来等待它获取所有评论。应该有更好的方法来收集它。我试图找到一种使用 Java Script 的方法,但我找不到使用 python 为 selenium 编写的方法。遗憾的是,我对 JavaScript 本身并不熟悉。

但是如果有办法并且有人可以给我一些例子,我可以学得很快。希望有人能启发我。感谢您的宝贵时间,并提前感谢您的帮助。

标签: javascriptpython-3.xseleniumselenium-webdriver

解决方案


我从这个页面获得评论的时间减少了大约 17 分钟(11 分钟 - 点击显示更多链接,6 分钟 - 获取数据)。

代码:

driver = webdriver.Chrome()
driver.get('https://n.news.naver.com/mnews/article/comment/023/0003390153?sid=102')

content = []
name = []
r_time = []

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "u_cbox_page_more")))    # need for click by JS

while True:
    try:
        driver.execute_script("document.querySelector(\".u_cbox_paginate[style=''] .u_cbox_page_more\").click(); window.scrollTo(0,document.body.scrollHeight);")
        # WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "u_cbox_page_more"))).click()
        # WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".u_cbox_page_more"))).click()
        # WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='u_cbox_page_more']"))).click()
    except:
        break

comment_list = driver.find_elements_by_xpath("//ul[@class='u_cbox_list']/li")

for comment in comment_list:
    try:
        con = driver.execute_script("return arguments[0].querySelector('.u_cbox_contents').innerText;", comment)
        content.append(con)
    except Exception:
        continue

    name.append(driver.execute_script("return arguments[0].querySelector('.u_cbox_nick').innerText;", comment))
    r_time.append(driver.execute_script("return arguments[0].querySelector('.u_cbox_date').innerText;", comment))

奖金。在上面的代码中,您可以看到 4 种显示所有评论的方式。我比较了它们:

|---------------------|------------------|
|    locator type     |       time, s    |
|---------------------|------------------|
|          JS         |        656.9     |
|---------------------|------------------|
|       class name    |        728.1     |
|---------------------|------------------|
|         css         |        736.5     |
|---------------------|------------------|
|        xpath        |        774.3     |
|---------------------|------------------|

推荐阅读