javascript - 使用硒获取 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 本身并不熟悉。
但是如果有办法并且有人可以给我一些例子,我可以学得很快。希望有人能启发我。感谢您的宝贵时间,并提前感谢您的帮助。
解决方案
我从这个页面获得评论的时间减少了大约 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 |
|---------------------|------------------|
推荐阅读
- python - 在 python 烧瓶网页上包含单选按钮
- excel - 如何从Excel中的字段中提取特定文本?
- javascript - 使用 Javascript 阻止元素发送到下一行
- java - 如何使android中的flexbox布局内的视图占据reemiaing空间
- python - 如何在没有表单的情况下直接在 django 中将项目添加到数据库
- c++ - 使用来自不同头文件 C++ 和 CMake 的类和函数
- javascript - 自动完成功能不适用于 IE11 和 Safari 浏览器
- asp.net - 如何将框架 4.6.1 类库转换为核心 3.1?
- c# - 如何使用 C# 在 SQLite 中获取最后插入的 id?
- android - 收到错误 MockKException: no answer found for: Observer(#8).onChanged Android