基于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
相关产品推荐
相关产品推荐

