VGChartz游戏库爬虫卡顿求助:Jupyter Notebook执行停滞
解决方案与替代爬取方式
一、解决Jupyter卡顿问题
- 修复循环逻辑:原代码的
while data_exists大概率是判断条件失效导致无限循环,先检查data_exists的判定逻辑——比如是否通过页面数据行的存在性判断?如果页面结构变动,这个判断会失效,直接导致循环停不下来。建议给循环加最大页数限制,比如max_pages = 100,超过阈值就强制退出。 - 添加请求延迟与异常捕获:每次请求后调用
time.sleep(2)(避免触发反爬机制),同时捕获requests请求异常,防止单次请求失败导致进程挂死。 - 拆分任务:如果爬取页数多,别在Jupyter单单元格里跑全量任务,拆成小批次执行,或者用脚本在终端运行,比Notebook更稳定。
二、针对无类名、结构混乱页面的爬取方法
vgchartz游戏列表是表格布局,可通过表格属性与层级关系定位数据:
- 用
BeautifulSoup解析页面后,通过width="98%"属性筛选主表格(这是页面里唯一符合该宽度的表格)。 - 跳过表头行,直接遍历数据行提取内容,示例代码:
import requests from bs4 import BeautifulSoup import time base_url = "https://www.vgchartz.com/gamedb/?page={}" max_pages = 50 page = 1 while page <= max_pages: try: # 加请求头模拟浏览器 resp = requests.get(base_url.format(page), headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" }) resp.raise_for_status() soup = BeautifulSoup(resp.text, "html.parser") # 定位主数据表格 main_table = soup.find("table", width="98%") if not main_table: print("未找到数据表格,停止爬取") break # 跳过前2行表头,从第3行开始是有效数据 data_rows = main_table.find_all("tr")[2:] for row in data_rows: cells = row.find_all("td") # 过滤空行或无效行 if len(cells) < 7: continue # 提取各字段 rank = cells[0].text.strip() game = cells[2].text.strip() platform = cells[3].text.strip() global_sales = cells[6].text.strip() # 自行处理存储逻辑(比如写入CSV) print(f"Rank: {rank}, Game: {game}, Sales: {global_sales}") page += 1 time.sleep(2) except Exception as e: print(f"第{page}页爬取失败: {str(e)}") break
- 优先使用
html.parser解析器,避免lxml因页面不规范HTML导致的解析异常。
三、替代爬取思路
如果主站爬取仍受阻,试试这些方案:
- 利用筛选接口:通过页面上的平台、地区、年份筛选功能,拆分数据批次,每个筛选后的页面结构更统一,爬取难度更低。
- 爬取详情页:从列表页提取游戏详情链接(
cells[2].find("a")["href"]),逐个爬取详情页数据——详情页的结构更稳定,数据字段也更完整。 - 无头浏览器渲染:如果网站存在动态加载(比如滚动加载数据),用
selenium+ChromeDriver模拟浏览器加载,再提取DOM内容。注意添加隐式等待(driver.implicitly_wait(10))和请求延迟,避免被反爬拦截。
内容的提问来源于stack exchange,提问作者user22293793
相关产品推荐
相关产品推荐

