使用Requests与BeautifulSoup爬取网页时,修改页码参数仍重复获取第一页数据的技术求助
解决翻页爬取始终返回同一页面数据的问题
我看了你的代码,发现核心问题出在请求参数的传递方式和URL的设置上,这就是为什么你明明改了pageStart页码,却始终拿到第一页的内容。咱们一步步来修复:
问题分析
- 错误的参数传递位置:你把分页参数
pageStart放到了请求头的path字段里,但服务器根本不会读取请求头里的这个字段来处理分页——GET请求的查询参数应该直接拼接在URL末尾,这是标准的做法。 - 空的请求URL:你初始化
source_url为空字符串,这会导致请求无效,大概率是你之前测试时遗漏了基础URL的填写。
修改后的完整代码
from bs4 import BeautifulSoup import requests import time # 用来加请求延迟,避免被封 def traverse_source(): article_links = [] # 填写正确的基础页面URL base_url = "https://www.annemergmed.com/issue/S0196-0644(21)X0012-1" for pgindx in range(9): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', "Sec-fetch-site": "same-origin", } # 正确拼接分页参数到URL末尾 source_url = f"{base_url}?pageStart={pgindx}" source_data = requests.get(source_url, headers=headers) # 打印当前请求的URL,方便确认分页参数是否生效 print(f"正在请求第 {pgindx+1} 页: {source_url}") print(source_data.headers) source_soup = BeautifulSoup(source_data.content, "html.parser") destination = source_soup.find_all("h3", attrs={'class': 'toc__item__title' }) for dest in destination: # 捕获具体异常,避免隐藏其他问题 try: article_links.append("https://www.annemergmed.com" + dest.a['href']) except AttributeError: print(f"标题 {dest.get_text(strip=True)} 没有找到链接,跳过") # 加1秒延迟,降低请求频率 time.sleep(1) print("爬取到的所有文章链接:") for link in article_links: print(link) if __name__ == "__main__": traverse_source()
关键修改点说明
- 正确构建请求URL:把
pageStart作为查询参数直接拼在基础URL后面,服务器会识别这个参数并返回对应页码的内容。 - 移除无效请求头:删掉了headers里的
path字段,这个字段不是标准HTTP请求头,服务器不会处理它。 - 添加请求延迟:加入
time.sleep(1)避免短时间内发送大量请求,降低被网站封禁IP的风险。 - 精准异常捕获:把
except:改成except AttributeError:,只捕获找不到a标签的情况,方便排查其他潜在问题。 - 增加调试信息:打印当前请求的URL和异常提示,让你能直观看到爬取过程中的状态。
额外建议
- 先手动访问拼接后的URL(比如
https://www.annemergmed.com/issue/S0196-0644(21)X0012-1?pageStart=1),确认页面确实返回了第二页的内容,避免网站有其他反爬机制(比如需要登录、Cookie验证等)。 - 查看网站的
robots.txt文件,确认你的爬取行为符合网站的规则。
内容的提问来源于stack exchange,提问作者Pradeep Karthik Muthusamy
相关产品推荐
相关产品推荐

