使用Python爬虫访问songfacts.com时出现连接拒绝(超重试上限)求助
解决Songfacts爬取时的连接阻断问题
这是典型的反爬拦截问题啊——网站能识别出你的请求是脚本发出的,而非真实浏览器,所以在你尝试解析页面内容时触发了阻断(其实大概率是后续请求被拦,只是刚好在加了BeautifulSoup之后显现出来)。下面给你几个可行的解决方案:
添加完整请求头伪装浏览器
网站通常会检查User-Agent、Accept等请求头字段,补全这些字段能让你的请求更像真实用户的浏览器行为:import requests from bs4 import BeautifulSoup # 模拟Chrome浏览器的请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3' } url = getSongUrlFor(title) page = requests.get(url, headers=headers).text soup = BeautifulSoup(page, 'html.parser') # 先验证基本解析是否正常,再提取全文本 print(soup.title.string) content = soup.get_text()这里建议先不要急着调用
get_text(),先打印页面标题这类简单内容,确认解析正常后再提取全文本。添加请求延迟避免频率触发拦截
有些网站会限制请求频率,你可以在请求之间添加短暂休眠,降低被判定为爬虫的概率:import time # 在请求前或请求后添加1秒左右的延迟 time.sleep(1) page = requests.get(url, headers=headers).text使用会话维持Cookie状态
部分网站会通过Cookie验证会话合法性,用requests.Session()可以自动维持会话,处理Cookie:session = requests.Session() session.headers.update(headers) # 先访问一次首页建立会话,再请求目标页面 session.get('https://www.songfacts.com') page = session.get(url).text soup = BeautifulSoup(page, 'html.parser')
你提到仅运行前两行正常,大概率是网站对首次请求放行,但后续请求(哪怕是同一个URL)因为缺少请求头被拦截——核心就是要让你的脚本尽可能模拟真实用户的浏览行为,减少被识别为爬虫的可能。
内容的提问来源于stack exchange,提问作者Jonathan Tuzman
相关产品推荐
相关产品推荐

