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

基于bs4与urlopen的MTG卡片爬虫自动翻页失效问题排查

嘿,我来帮你排查下这个翻页失效的问题!这种情况我碰到过好多次,大概率是这几个常见坑导致的:

可能的原因及解决思路

1. 循环里没更新当前请求的URL

这是最容易踩的坑!你可能在循环中一直用初始页面的URL发请求,完全没把每次解析到的下一页URL赋值给请求变量。举个错误示例:

# 错误写法:始终用初始URL请求
current_url = "你的初始页面URL"
for _ in range(total_pages):
    response = urlopen(current_url)
    soup = BeautifulSoup(response, 'html.parser')
    # 爬取卡片逻辑...
    next_page_url = soup.find("a", class_="next").get("href")
    # 这里忘了把next_page_url赋值给current_url!

解决办法:每次拿到下一页URL后,立刻更新current_url,确保下一次循环请求的是新页面:

current_url = "你的初始页面URL"
for _ in range(total_pages):
    response = urlopen(current_url)
    soup = BeautifulSoup(response, 'html.parser')
    # 爬取卡片逻辑...
    
    # 处理下一页链接
    next_page_tag = soup.find("a", class_="next")
    if not next_page_tag:
        break  # 没有下一页就提前退出循环
    current_url = next_page_tag.get("href")
    
    # 重点:如果是相对路径,要拼接成绝对URL
    if not current_url.startswith("http"):
        from urllib.parse import urljoin
        current_url = urljoin("网站基础域名(比如https://mtg-example.com)", current_url)

2. 下一页是相对路径,直接请求导致跳转到错误页面

很多网站的翻页链接是相对路径(比如/cards?page=2),如果直接用urlopen请求这个路径,会被解析成本地路径或者无效URL,有些网站会容错跳回初始页,导致你看起来只爬了第一页但没报错。
解决办法:用urljoin把相对路径转成绝对URL,上面的代码已经包含了这个处理逻辑。

3. 循环次数设置错误

比如你获取的总页数是total_pages,但初始页已经是第1页了,循环次数应该是total_pages - 1?或者你提取总页数时没把字符串转成整数,导致循环次数为0?
检查点:打印total_pages的值确认是否正确。比如:

# 假设网站显示"共12页",提取数字
total_pages_text = soup.find("span", class_="total-pages").text
total_pages = int(total_pages_text.split()[-1])
print(f"确认总页数:{total_pages}")

4. 网站反爬拦截,返回重复页面

urlopen默认的请求头很容易被识别成爬虫,有些网站会给无请求头的请求返回初始页,而不是报错。
解决办法:自定义请求头,用Request对象发起请求:

from urllib.request import Request, urlopen

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

current_url = "你的初始页面URL"
for _ in range(total_pages):
    req = Request(current_url, headers=headers)
    response = urlopen(req)
    soup = BeautifulSoup(response, 'html.parser')
    # 爬取卡片逻辑...
    # 更新current_url...

5. 下一页选择器不准确

比如你用的find方法找下一页标签,但网站的下一页元素在不同页面有变化?或者到最后一页时没有下一页标签,你没做判断导致current_url变成None?
检查点:在循环里打印每次获取的下一页URL,确认是否正确:

next_page_tag = soup.find("a", class_="next")
if next_page_tag:
    next_page_url = next_page_tag.get("href")
    print(f"下一页URL:{next_page_url}")
    current_url = next_page_url
else:
    print("已到最后一页,退出循环")
    break

内容的提问来源于stack exchange,提问作者Petris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:37