3.4.2 爬取豆瓣影评实战

课程目标

  • 爬取豆瓣影评实战

课程内容

编码实现
爬虫部分
import requests  # 导入requests库,用于发送HTTP请求
from fake_useragent import UserAgent  # 导入UserAgent库,用于生成随机的User-Agent
import bs4  # 导入BeautifulSoup库,用于解析HTML内容
from tqdm import tqdm  # 导入tqdm库,用于显示进度条
import time  # 导入time库,用于暂停执行
import pandas as pd  # 导入pandas库,用于数据处理和生成Excel文件

# 定义一个函数,用于获取评论的详细信息
def get_detail(data_rid):
    headers = {
        # 设置请求头,模拟浏览器行为
    }
    url = f"https://movie.douban.com/j/review/{data_rid}/full"  # 构造请求URL
    response = requests.get(url, headers=headers)  # 发送GET请求
    rj = response.json()  # 解析返回的JSON数据

    soup_ht = bs4.BeautifulSoup(rj['html'], 'html.parser')  # 解析HTML
    return soup_ht.text  # 返回评论文本内容

# 初始化一个空列表,用于存储爬取的数据
infos = []

# 循环爬取10页数据
for page in range(10):
    print("正在爬取第{}页".format(page+1))  # 打印当前爬取的页码
    # 设置请求头
    headers = {
        # ...
    }

    # 构造请求URL
    url = "https://movie.douban.com/review/best"
    start = page * 20  # 计算每页的起始索引
    params = {
        "start": str(start),  # 将起始索引转换为字符串并设置为请求参数
    }
    response = requests.get(url, headers=headers, params=params)  # 发送GET请求
    soup = bs4.BeautifulSoup(response.text, 'html.parser')  # 解析HTML

    # 找到所有评论项
    son_divs = soup.find_all('div', class_='main review-item')
    for son_div in tqdm(son_divs):  # 使用tqdm显示进度条
        # 提取电影名称、图片URL、影评人名称、评论ID、评论内容、发布时间、赞数和踩数
        movie_name = son_div.a.img['alt']
        movie_name_img_url = son_div.a.img['src']
        writer_name = son_div.find("a", class_="name").text
        data_rid = son_div.find("div", class_="review-short")["data-rid"]
        comment_text = get_detail(data_rid)  # 调用函数获取评论内容
        create_time = son_div.find('span', class_='main-meta').text
        favour = int(son_div.find('a', {'title': '有用'}).span.text.strip()) if son_div.find('a', {'title': '有用'}) else 0
        tread = int(son_div.find('a', {'title': '没用'}).span.text.strip()) if son_div.find('a', {'title': '没用'}) else 0

        # 将提取的数据存储为字典,并添加到infos列表中
        info = {
            "电影名称": movie_name,
            "电影图片": movie_name_img_url,
            "影评人": writer_name,
            "评论内容": comment_text,
            "发布时间": create_time,
            "赞": favour,
            "踩": tread
        }
        infos.append(info)
    
    time.sleep(0.3)  # 暂停0.3秒,避免请求过快被限制

# 将爬取的数据转换为pandas的DataFrame对象
df = pd.DataFrame(infos)
print(df.head())  # 打印前几行数据,用于检查
df.to_excel('豆瓣影评.xlsx', index=False)  # 将数据保存到Excel文件中
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值