如何解决TooManyRedirects: Exceeded 30 redirects错误?附爬虫代码
解决requests爬取roco.cc时的TooManyRedirects错误
错误原因及修复方案
1. 修正请求头键名错误
你的headers字典中User-Agent的键名写错了,正确键名是'User-Agent'(带连字符),服务器可能因识别不到合法UA触发重定向。
修改后的请求头:
headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36' }
2. 使用Session维持会话
网站可能通过Cookie验证会话,重复创建新请求会导致重复重定向。用requests.Session()维持会话,自动处理Cookie,避免多次重定向触发限制。
修改示例:
# 初始化会话 session = requests.Session() session.headers.update(headers) # 爬取列表页 for x in range(1,2): url = f'https://www.roco.cc/ren/products/locomotives/steam-locomotives.html?p={x}&verfuegbarkeit_status=41%2C42%2C43%2C45%2C44' r = session.get(url) soup = BeautifulSoup(r.content, 'lxml') productlist = soup.find_all('li', class_='item product product-item') for item in productlist: for link in item.find_all('a', class_='product-item-link', href=True): productlinks.append(link['href']) # 爬取产品详情页 for link in productlinks: # 处理相对路径 if not link.startswith('http'): link = baseurl + link.lstrip('/') r = session.get(link) # 后续解析代码不变
3. 规范产品链接格式
从页面获取的href可能是相对路径,直接请求会触发重定向到完整路径,多次累积后超出重定向次数限制。需先判断链接是否为绝对路径,非绝对路径则拼接baseurl。
4. 添加语言请求头
roco.cc可能根据请求的语言设置重定向到对应站点,添加Accept-Language头匹配网站语言:
headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9' # 或使用德语 'de-DE,de;q=0.9' }
5. 调试重定向链(排查用)
若以上方法无效,可临时关闭重定向,查看服务器的重定向目标,排查循环重定向原因:
r = session.get(url, allow_redirects=False) print(r.status_code, r.headers.get('Location'))
额外代码优化提示
你的数据字典存在键值倒置问题,比如Manufacturer_name: 'Manufacturer_name'应改为'Manufacturer_name': Manufacturer_name,否则无法正确存储爬取数据:
Locomotives = { 'Manufacturer_name': Manufacturer_name, 'Reference': Reference, 'Price': Price, 'Type': Type, 'Scale': Scale, 'Current': Current, 'Control': Control, 'Interface': Interface, 'Digital_decoder': Digital_decoder, 'Decoder_Type': Decoder_Type, 'Motor': Motor, 'Flywheel': Flywheel, 'Minimum_radius': Minimum_radius, 'Length_over_buffer': Length_over_buffer, 'Number_of_driven_axles': Number_of_driven_axles, 'Number_of_axles_with_traction_tyres': Number_of_axles_with_traction_tyres, 'Coupling': Coupling, 'LED_lighting': LED_lighting, 'Head_light': Head_light, 'LED_head_light': LED_head_light, 'Country': Country, 'Railway_company': Railway_company, 'Epoch': Epoch, 'Description': Description, }
内容的提问来源于stack exchange,提问作者Filip Chobodicky
相关产品推荐
相关产品推荐

