基于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,提问作者강태규
相关产品推荐
相关产品推荐

