使用BeautifulSoup爬取在线词典单词时的while与for循环问题
问题根源
你的page变量初始化位置错误,放在了遍历字母的for循环外层。当首个字母A的100页内容处理完成后,page的值已经变为100,后续遍历B、C字母时,while page != 100的判断条件直接不成立,不会进入页码循环,因此只能拿到A开头的单词。
修正后的代码
将page = 1的初始化逻辑挪到字母遍历的for循环内部,每次处理新字母时重置页码:
def get_data(): letters = ['A', 'B', 'C'] all_words = [] for letter in letters: page = 1 # 每次处理新字母时重置页码为1 while page != 100: url = f"https://dictionnaire.lerobert.com/explore/def/{letter}/{page}" soup = BeautifulSoup(requests.get(url=url).text, 'html.parser') data = soup.find(class_='l-l') if not data: # 提前判断节点是否存在,避免后续报错 break for word in data.find_all('a'): all_words.append(word['href']) page = page + 1 print(all_words) print(len(all_words))
此前把while循环移到外层逻辑错误的原因
该逻辑会按「第1页遍历A/B/C三个字母的对应页面→第2页遍历A/B/C三个字母的对应页面→…→第100页遍历」的顺序执行,当某个字母的实际总页数小于100时,超过页数的请求不会返回有效单词,甚至会因为找不到对应节点触发报错,你拿到的额外几十个单词大概率是B、C字母前几页的内容,其余都是无效请求,因此总数量远低于预期。
优化建议
- 不要硬编码页码上限为100,不同首字母的单词总页数不同,有的可能只有几十页,硬写100会产生大量无效请求
- 可以在每次请求后判断
data是否存在,不存在就直接终止当前字母的页码循环,既避免报错也能减少无效请求 - 可以给请求加延迟,避免触发网站的反爬机制导致IP被封禁
内容的提问来源于stack exchange,提问作者bientavu
相关产品推荐
相关产品推荐

