使用Python3爬取quotes.toscrape.com时代码陷入无限循环是什么原因?
代码问题排查结论
你的编辑器无响应不是运行时间不够,是代码存在无限死循环的逻辑缺陷,具体原因如下:
http://quotes.toscrape.com对于超过总页数的请求不会返回4xx/5xx错误码,会返回状态码200的正常空白页面,requests.get不会抛出异常,你写的try...except逻辑永远触发不了终止条件,while True会无限执行请求。- 你原本的页码计算逻辑冗余,也没有设置除异常外的其他终止判断,导致循环会一直生成新的页码请求空页面。
修复后的可用代码
import requests import bs4 authors = set() page = 1 # 统一页码规则,page=1对应首页内容和根域名完全一致 base_url = "http://quotes.toscrape.com/page/{}/" while True: res = requests.get(base_url.format(page), timeout=10) soup = bs4.BeautifulSoup(res.text, 'lxml') current_authors = soup.select('.author') # 当页无作者信息说明已经爬完所有页面,终止循环 if not current_authors: break for name in current_authors: authors.add(name.text) page += 1 # 打印最终爬取结果 print(authors)
额外优化建议
- 不要使用空的
except块,会吞掉所有意料之外的异常(比如网络中断、依赖包缺失报错等),建议明确指定需要捕获的异常类型,比如except requests.exceptions.RequestException: - 给
requests.get添加timeout参数,避免网络波动导致请求长时间卡住
内容的提问来源于stack exchange,提问作者NightRaven
相关产品推荐
相关产品推荐

