【问题标题】:Fast way to get li datas with selenium?使用硒获取 li 数据的快速方法?
【发布时间】:2020-09-29 16:15:37
【问题描述】:

感谢您查看这篇文章。

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

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

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

直到它显示完整的 cmets。

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

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 本身并不熟悉。

但是如果有办法并且有人可以向我展示一些示例,我可以快速学习。 希望有人能启发我。 感谢您抽出宝贵时间,并提前感谢您的帮助。

【问题讨论】:

    标签: javascript python-3.x selenium selenium-webdriver


    【解决方案1】:

    我已将从此页面获取 cmets 减少到大约 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))
    

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

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

    【讨论】:

    • 非常感谢!更感谢您使用 view_more 代码获得周到的奖金!这比我用的那个好多了。它肯定也会对我未来的工作有所帮助。 - 我在睡觉之前尝试了上面的代码,但它没有完成大约 6 个小时的抓取。(嗯,不仅是这个页面,而且当我醒来时,它正在处理这个页面)再次感谢你。希望有一天你去韩国,我可以请你喝啤酒什么的。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2013-01-17
    • 2013-03-14
    • 2016-02-01
    相关资源
    最近更新 更多