从新闻网站中提取用户评论

Posted

技术标签:

【中文标题】从新闻网站中提取用户评论【英文标题】:Extracting user comments from news website 【发布时间】:2016-08-16 09:08:32 【问题描述】:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def wait(dr, x):
  element = WebDriverWait(dr, 50).until(
    EC.presence_of_all_elements_located((By.XPATH, x))
)
return element
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.dinamalar.com/user_comments.asp? uid=14701&name=%E0%AE%A4%E0%AE%AE%E0%AE%BF%E0%AE%B4%E0%AF%8D%E0%AE%9A%E0%AF%86%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%A9%E0%AF%8D")
for elem in wait(browser, '//*[@id="commsec"]/div[2]/div[1]'):
print elem.text

这是我需要提取所有 cmets http://www.dinamalar.com/user_comments.asp?uid=14701&name=%E0%AE%A4%E0%AE%AE%E0%AE%BF%E0%AE%B4%E0%AF%8D%E0%AE%9A%E0%AF%86%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%A9%E0%AF%8D的链接

但是我的代码只提取了前 10 个 cmets。单击按钮后,将动态加载其他 10 个 cmets。如何使用 python selenium 提取所有这些 cmets

【问题讨论】:

【参考方案1】:

这个想法是寻找页面上存在多少“更多想法”元素。每次单击按钮并加载更多 cmets 时,就会出现一个“更多想法”红色按钮。实施:

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver


browser = webdriver.Firefox()
wait = WebDriverWait(browser, 10)
browser.get("http://www.dinamalar.com/user_comments.asp?uid=14701&name=%E0%AE%A4%E0%AE%AE%E0%AE%BF%E0%AE%B4%E0%AF%8D%E0%AE%9A%E0%AF%86%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%A9%E0%AF%8D")

# initial wait for the page to load
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".morered")))

pages = 1
while True:
    browser.find_elements_by_css_selector(".morered")[-1].click()

    # wait for more "load more" buttons to be present
    try:
        wait.until(lambda browser: len(browser.find_elements_by_css_selector(".morered")) > pages)
    except TimeoutException:
        break  # no more data loaded, exit the loop

    print("Comments loaded: %d" % len(browser.find_elements_by_css_selector(".dateg")))

    pages += 1

browser.close()

请注意,我还删除了 URL 中的多余空间。

【讨论】:

谢谢,工作正常。我是初学者,所以如何获得 cmets @VinayakumarR 我会在这里使用 XPath:comments = [element.text for element in browser.find_elements_by_xpath("//div[@class='boxcmt1']//a[@class='heading']/following-sibling::div")]。请测试。谢谢。 将此行添加到现有代码后,显示警告 I/O 警告 Non ASCII found,但我尝试运行它,它显示错误 这很好用 cmets = [element.text for element in browser.find_elements_by_xpath("//div[@class='boxcmt1']//a[@class='heading']")]但它返回 unicode @VinayakumarR 当然,但 unicode 有什么问题?谢谢。

以上是关于从新闻网站中提取用户评论的主要内容,如果未能解决你的问题,请参考以下文章

BeautifulSoup 从评论 html 中提取文本 [重复]

腾讯网易新浪新闻网站爬虫编写记录及评论格式分析

抽屉之Tornado实战--点赞与评论树

在 R 中抓取 Youtube 评论

获取 google 评论并创建与 Google API 一起使用的评论表单

ruby 从Niconama评论查看器中提取评论