使用Selenium爬取《穿靴子的猫2》豆瓣电影影评数据
使用Selenium爬取《穿靴子的猫2》豆瓣电影影评数据
本文将介绍如何使用Selenium库爬取《穿靴子的猫2》在豆瓣电影上的所有页的影评数据。具体步骤如下:
步骤1:借助Selenium库,点击进入电影全部影评
首先需要安装Selenium库,可以通过以下命令进行安装:
pip install selenium
然后,可以通过以下代码实现点击进入电影全部影评:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 使用Chrome浏览器
driver = webdriver.Chrome()
# 打开豆瓣电影页面
driver.get('https://movie.douban.com/subject/25868125/')
# 点击“全部影评”按钮
button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#reviews-wrapper > div.mod-hd > h2 > span.pl > a')))
button.click()
步骤2:从'https://movie.douban.com/subject/25868125/comments?start=0&limit=20&status=P&sort=new_score'地址开始,抓取第一页的评论人名称、评论时间以及评论。
通过以下代码抓取第一页的评论人名称、评论时间以及评论:
import re
# 定位到评论区的iframe
driver.switch_to.frame(driver.find_element_by_css_selector('#content > div > div.article > div > div.review > div.mod-hd > h2 > span.ph'))
# 获取第一页中所有评论
comments = driver.find_elements_by_css_selector('div.comment-item')
# 遍历每一条评论,获取评论人名称、评论时间和评论
for comment in comments:
# 评论人名称
name = comment.find_element_by_css_selector('div.avatar > a').get_attribute('title')
# 评论时间
time = comment.find_element_by_css_selector('div > h3 > span.comment-info > span.comment-time').get_attribute('title')
# 评论
content = comment.find_element_by_css_selector('div > p').text
# 去除换行符和空格
content = re.sub('\n| ', '', content)
print(name, time, content)
以上代码中,通过定位到评论区的iframe,然后获取第一页中所有评论,并遍历每一条评论,获取评论人名称、评论时间和评论。由于评论中可能会存在换行符和空格,所以需要使用正则表达式去除。
步骤3:继续抓取2-3页的所有评论人名称、评论时间以及评论。
可以通过以下代码抓取2-3页的所有评论人名称、评论时间以及评论:
import time
# 遍历2-3页
for i in range(1, 3):
# 构造url
url = 'https://movie.douban.com/subject/25868125/comments?start={}&limit=20&status=P&sort=new_score'.format(i * 20)
# 打开url
driver.get(url)
# 定位到评论区的iframe
driver.switch_to.frame(driver.find_element_by_css_selector('#content > div > div.article > div > div.review > div.mod-hd > h2 > span.ph'))
# 获取当前页所有评论
comments = driver.find_elements_by_css_selector('div.comment-item')
# 遍历每一条评论,获取评论人名称、评论时间和评论
for comment in comments:
# 评论人名称
name = comment.find_element_by_css_selector('div.avatar > a').get_attribute('title')
# 评论时间
time = comment.find_element_by_css_selector('div > h3 > span.comment-info > span.comment-time').get_attribute('title')
# 评论
content = comment.find_element_by_css_selector('div > p').text
# 去除换行符和空格
content = re.sub('\n| ', '', content)
print(name, time, content)
# 等待页面加载完成
time.sleep(1)
# 关闭浏览器
driver.quit()
以上代码中,通过循环构造url,然后打开url,获取当前页所有评论,并遍历每一条评论,获取评论人名称、评论时间和评论。由于每次打开url需要等待页面加载完成,所以需要使用time.sleep()方法等待1秒。
步骤4:将抓取到的数据以文件存储的方式,存储为json格式数据。
将抓取到的数据以文件存储的方式,存储为json格式数据,可以通过以下代码实现:
import json
# 存储数据的列表
data = []
# 遍历2-3页
for i in range(1, 3):
# 构造url
url = 'https://movie.douban.com/subject/25868125/comments?start={}&limit=20&status=P&sort=new_score'.format(i * 20)
# 打开url
driver.get(url)
# 定位到评论区的iframe
driver.switch_to.frame(driver.find_element_by_css_selector('#content > div > div.article > div > div.review > div.mod-hd > h2 > span.ph'))
# 获取当前页所有评论
comments = driver.find_elements_by_css_selector('div.comment-item')
# 遍历每一条评论,获取评论人名称、评论时间和评论
for comment in comments:
# 评论人名称
name = comment.find_element_by_css_selector('div.avatar > a').get_attribute('title')
# 评论时间
time = comment.find_element_by_css_selector('div > h3 > span.comment-info > span.comment-time').get_attribute('title')
# 评论
content = comment.find_element_by_css_selector('div > p').text
# 去除换行符和空格
content = re.sub('\n| ', '', content)
# 存储数据到列表
data.append({'name': name, 'time': time, 'content': content})
# 等待页面加载完成
time.sleep(1)
# 关闭浏览器
driver.quit()
# 将数据存储为json格式文件
with open('comments.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False)
以上代码中,通过循环遍历每一条评论,并将评论人名称、评论时间和评论存储到列表中。最后,使用json.dump()方法将数据存储为json格式文件。
注意:
- 运行以上代码之前,需要确保已经安装了Selenium库和Chrome浏览器驱动。
- 以上代码仅抓取了2-3页的影评数据,如果需要抓取所有页面的数据,需要修改代码中的循环条件。
- 抓取数据时,请遵守豆瓣电影网站的使用规则,避免过度抓取造成服务器负担。
原文地址: https://www.cveoy.top/t/topic/oBhZ 著作权归作者所有。请勿转载和采集!