使用BeautifulSoup分页爬取Bodybuilding.com会员信息时数据重复问题求助
解决Bodybuilding.com爬取第二页数据重复的问题
嘿,我之前爬类似健身类网站的时候也碰到过这种分页数据重复的坑,来帮你拆解下可能的原因和解决思路:
大概率是这几个原因导致的
- 分页参数没真正更新:很多网站靠URL里的
page参数控制分页,比如?page=2。如果你的第28行代码看起来改了变量,但实际请求的URL还是停留在page=1,那肯定拿到的还是第一页数据。比如你可能只在初始化时给page_url赋值了一次,循环里没重新拼接新的页码。 - 网站用了动态加载(AJAX/JS):Bodybuilding.com这类流量大的网站,大概率是用JavaScript异步加载分页内容的。你直接请求页面静态HTML的话,哪怕改了页码参数,返回的还是第一页的初始内容,第二页的数据是之后通过AJAX接口拉取的。这种情况就得抓包找真实的API接口,而不是硬啃页面HTML。
- 变量作用域搞混了:如果第28行的变量是全局变量,或者在循环里没正确重置,也会一直用第一页的参数。比如你定义的
current_page变量没在每次循环里递增,那拼出来的URL永远都是第一页的。
给你几个排查和修复的步骤
- 先看请求URL对不对:在代码里加个打印,把每次请求的URL输出来,看看第二页的URL是不是真的变成了
https://www.bodybuilding.com/members?page=2(或者对应网站的分页格式)。如果还是page=1,那就是变量更新的逻辑有问题。 - 抓包找真实请求:打开浏览器F12进Network标签,手动点第二页,看看有没有XHR/fetch类型的请求。要是有,那个请求的URL和参数才是你该爬的目标——比如可能是个返回JSON的API,直接请求这个接口就能拿到正确的分页数据了。
- 检查变量更新逻辑:确认第28行的变量是在每次循环里重新计算的。比如原本你可能是这么写的(错误示范):
page_url = "https://www.bodybuilding.com/members?page=1" for page_num in range(1, 3): # 这里没更新page_url,一直请求第一页 resp = requests.get(page_url) # 解析数据...
改成这样就对了:
for page_num in range(1, 3): page_url = f"https://www.bodybuilding.com/members?page={page_num}" # 每次循环重新拼URL resp = requests.get(page_url, headers={"User-Agent": "你的浏览器UA"}) # 解析数据...
另外提一句,Bodybuilding.com有反爬机制,记得加个合理的User-Agent,必要时给请求加个1-2秒的延迟,别猛刷,不然容易被封IP。
内容的提问来源于stack exchange,提问作者ekim420
相关产品推荐
相关产品推荐

