使用BeautifulSoup和requests分页爬取多页内容报错求解
问题根因
你的代码有三个明确错误,分别对应无限加载和变量报错问题:
- 死循环:
while True写在单条搜索结果的遍历循环内部,既没有循环退出条件,也没有页码跳转逻辑,程序会卡在第一条结果的处理步骤无限运行 - 分页定位逻辑错误:分页按钮是页面级元素,不在单条搜索结果(
PartialSearchResults-item)的节点范围内,在单条结果里找下一页链接永远拿不到有效值 - 变量未定义:你参考的URL拼接规则里用到了
page变量,但既没有初始化这个变量,也没有写页码遍历的循环逻辑,触发name 'page' is not defined是必然结果
可直接运行的修复代码
Ask.com每页默认返回10条左右搜索结果,分页直接通过URL的page参数控制,不需要手动解析下一页链接,爬取含首页在内共6页结果的实现如下:
import time import requests from bs4 import BeautifulSoup as bs def search(request): if request.method == 'POST': search_keyword = request.POST['search'] final_result = [] # 配置请求头模拟浏览器,避免被反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } # 循环爬取第1到第6页结果 for page in range(1, 7): target_url = f'https://www.ask.com/web?q={search_keyword}&page={page}' res = requests.get(target_url, headers=headers) soup = bs(res.text, 'lxml') result_listings = soup.find_all('div', {'class': 'PartialSearchResults-item'}) for result in result_listings: try: result_title = result.find(class_='PartialSearchResults-item-title').text.strip() result_url = result.find('a').get('href') result_desc = result.find(class_='PartialSearchResults-item-abstract').text.strip() final_result.append((result_title, result_url, result_desc)) except AttributeError: # 跳过混合在结果里的广告、异常结构节点 continue # 加请求间隔避免频率过高被封 time.sleep(1.5) context = { 'final_result': final_result } # 补全你原有的模板渲染逻辑即可,例如 return render(request, 'search.html', context)
注意事项
- 分页是页面级逻辑,必须放在单页结果解析的外层,不要写在单条结果的遍历循环内部
- 你之前参考的
start参数是Google等其他搜索引擎的分页规则,Ask.com直接传page页码即可,不需要做偏移量换算 - 爬取多页时保留1-2秒的请求间隔,避免请求频率过高被网站临时封禁IP
- 解析文本时加
strip()方法,可以去掉字段首尾多余的换行、空格,返回的结果更规整
内容的提问来源于stack exchange,提问作者gks
相关产品推荐
相关产品推荐

