Python爬取豆瓣电影的评论

目标网页

名侦探柯南VS怪盗基德 短评

接着开始点击F12,寻找我们想要的信息

 

Python代码

使用到的库

  • requests: 用于发送 HTTP 请求,获取网页内容。
  • BeautifulSoup: 来自 bs4 库,用于解析 HTML 和 XML 文档。
  • pandas: 用于数据处理和分析,特别是用于将数据保存为 Excel 文件。
  • load_workbook 和 Image: 来自 openpyxl 库,用于加载 Excel 文件并处理图像。
  • Alignment: 用于设置 Excel 单元格的对齐方式。
  • BytesIO: 用于处理二进制数据流,特别是在加载图片时使用。

具体代码

import requests
from bs4 import BeautifulSoup
import pandas as pd
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
from openpyxl.styles import Alignment
from io import BytesIO

# 要爬取的网页URL
base_url = 'https://movie.douban.com/subject/36671126/comments?status=P'
page_url = base_url

# 发送GET请求获取网页内容
response = requests.get(page_url, headers={'User-Agent': 'Mozilla/5.0'})
soup = BeautifulSoup(response.content, 'html.parser')

# 提取标题
title = soup.find('h1').get_text().strip()

# 初始化列表用于存储评论数据
data = {
    "用户头像": [],
    "序号": [],
    "帐号名称": [],
    "评价星级": [],
    "评价时间": [],
    "评价地点": [],
    "评论内容": []
}

count = 1  # 初始化序号

while True:
    # 逐个提取评论信息
    comment_items = soup.find_all('div', class_='comment-item')

    for item in comment_items:
        # 查找用户头像
        avatar_tag = item.find('img', class_='')
        avatar_url = avatar_tag['src'] if avatar_tag else ''

        # 查找帐号名称
        user_info = item.find('span', class_='comment-info')
        username = user_info.find('a').get_text().strip() if user_info else '未知用户'

        # 查找评价星级
        rating_tag = item.find('span', class_='rating')
        rating = rating_tag['title'] if rating_tag else '无评分'

        # 查找评价时间
        comment_time = item.find('span', class_='comment-time').get_text().strip() if item.find('span', class_='comment-time') else ''

        # 查找评价地点
        location = item.find('span', class_='comment-location')
        location = location.get_text().strip() if location else ''

        # 查找评论内容
        comment = item.find('span', class_='short').get_text().strip() if item.find('span', class_='short') else ''

        # 检查所有字段是否均为空
        if not (username == '未知用户' and rating == '无评分' and not comment_time and not location and not comment):
            # 添加数据
            data["用户头像"].append(avatar_url)
            data["序号"].append(count)
            data["帐号名称"].append(username)
            data["评价星级"].append(rating)
            data["评价时间"].append(comment_time)
            data["评价地点"].append(location)
            data["评论内容"].append(comment)

            count += 1  # 递增序号

    # 查找“后页”链接
    next_page = soup.find('a', class_='next')

    # 如果“后页”链接不存在或变为<span class="next">,则停止循环
    if not next_page or next_page.name == 'span':
        print("已到达最后一页,爬虫结束。")
        break

    # 更新page_url为下一个页面的URL
    page_url = 'https://movie.douban.com/subject/36671126/comments' + next_page['href']
    response = requests.get(page_url, headers={'User-Agent': 'Mozilla/5.0'})
    soup = BeautifulSoup(response.content, 'html.parser')

# 将数据转换为DataFrame
df = pd.DataFrame(data)

# 创建一个Excel写入器并写入标题和数据
excel_filename = 'douban_comments_with_title_and_avatar.xlsx'
with pd.ExcelWriter(excel_filename, engine='openpyxl') as writer:
    # 写入评论数据,从第三行开始
    df.to_excel(writer, sheet_name='Sheet1', index=False, startrow=2)

    # 获取当前工作簿
    workbook = writer.book
    worksheet = writer.sheets['Sheet1']

    # 合并前五列的第一、二行单元格并写入标题
    worksheet.merge_cells(start_row=1, start_column=1, end_row=2, end_column=10)
    worksheet['A1'] = title

    # 设置标题的对齐方式为居中
    worksheet['A1'].alignment = Alignment(horizontal='center', vertical='center')

    # 插入图片到Excel并调整行高和列宽
    for idx, img_url in enumerate(data["用户头像"], start=4):
        if img_url:  # 如果头像URL存在
            img_data = requests.get(img_url).content
            img = Image(BytesIO(img_data))
            img.width = 50  # 设置图片宽度
            img.height = 50  # 设置图片高度
            cell = f'A{idx}'
            worksheet.add_image(img, cell)

            # 调整行高和列宽以适应图片
            worksheet.row_dimensions[idx].height = 50  # 设置行高
            worksheet.column_dimensions['A'].width = 12  # 设置列宽

# 保存文件
print(f"数据已成功保存到 {excel_filename}")

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在奋斗的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值