目标网页
接着开始点击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}")
运行结果