You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Selenium与Beautiful Soup的Python多页面网络爬虫(翻页爬取)

问题:如何实现爬取电影详情页的所有分页评论?

我现在有一段代码只能爬取单页的评论,目标页面是Megabox的某部电影详情页,代码如下:

import requests 
import selenium 
from selenium import webdriver 
from bs4 import BeautifulSoup 

browser = webdriver.Firefox() 
browser.get('http://www.megabox.co.kr/?show=detail&rtnShowMovieCode=013491') 
html = browser.page_source 
soup = BeautifulSoup(html, 'html.parser') 
comment = soup.findAll('',{'class': 'comment'}) 
for i, t in enumerate(comment,1): 
    print('%2d: %s'%(i, t.text)) 

现在想实现爬取第1、2、3……所有页面的评论,恳请给出实现方法与解释。


解决方案与解释

首先咱们得先摸清楚这个网站的分页逻辑——我特意看了下目标页面,它的评论分页是通过**URL参数page**来控制的:第一页默认是page=1(或者不带参数),第二页就是page=2,以此类推。基于这个规律,我们可以通过循环页码的方式来爬取所有页面的评论,下面一步步给你拆解:

步骤1:明确分页URL结构

原基础URL是:http://www.megabox.co.kr/?show=detail&rtnShowMovieCode=013491
切换到第二页时,URL会变成:http://www.megabox.co.kr/?show=detail&rtnShowMovieCode=013491&page=2
也就是说,只需要给基础URL拼接&page=页码就能访问对应页的评论。

步骤2:处理页面加载与终止条件

因为用的是Selenium,要确保每次切换页码后评论区域完全加载;另外还要知道什么时候停止循环——比如当某一页找不到评论元素,就说明已经到最后一页了。

步骤3:完整实现代码

下面是加了详细注释的完整代码,兼顾可靠性和可读性:

import selenium 
from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup 
import time

# 初始化Firefox浏览器
browser = webdriver.Firefox()
# 电影详情页的基础URL
base_url = 'http://www.megabox.co.kr/?show=detail&rtnShowMovieCode=013491'
current_page = 1
all_comments = []

try:
    while True:
        # 构造当前页码的访问链接
        target_url = f"{base_url}&page={current_page}"
        browser.get(target_url)
        
        # 显式等待评论区域加载完成(最多等10秒),避免页面未加载完就解析
        WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, 'comment'))
        )
        # 给动态加载的内容留1秒缓冲时间
        time.sleep(1)
        
        # 解析页面源码提取评论
        html = browser.page_source 
        soup = BeautifulSoup(html, 'html.parser') 
        comment_list = soup.find_all(class_='comment')
        
        # 如果当前页没有评论,说明已经爬完所有页,终止循环
        if not comment_list:
            break
        
        # 提取评论文本并保存,同时打印输出
        for idx, comment in enumerate(comment_list, 1):
            clean_text = comment.text.strip()
            comment_info = f"第{current_page}页 - {idx}: {clean_text}"
            all_comments.append(comment_info)
            print(comment_info)
        
        # 页码递增,准备爬取下一页
        current_page += 1

finally:
    # 无论爬取是否成功,最后都关闭浏览器,避免资源占用
    browser.quit()

# 把所有评论保存到本地文件(用utf-8编码防止韩文乱码)
with open('megabox_movie_comments.txt', 'w', encoding='utf-8') as f:
    f.write('\n'.join(all_comments))

关键细节说明

  • 显式等待替代固定sleep:用WebDriverWait等待评论元素出现,比硬等固定时间更可靠,能适应不同的网络速度。
  • 终止循环逻辑:当某一页找不到comment类的元素时,说明已经到最后一页,停止循环。
  • 资源清理:用try...finally确保浏览器一定会关闭,不会出现浏览器进程残留的问题。
  • 编码处理:保存文件时指定utf-8编码,避免韩文评论出现乱码。

另外还有个优化方向:如果页面上显示了总页数(比如“共15页”),你可以先解析出总页数,然后直接循环到总页数,这样比一直循环到没有评论更高效,感兴趣的话可以自己尝试实现这个逻辑~

内容的提问来源于stack exchange,提问作者강태규

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:03:38