You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用urllib3爬取zk.fm遇502 Bad Gateway错误的解决咨询

问题:urllib3请求zk.fm返回502 Bad Gateway但浏览器可正常访问

我尝试爬取zk.fm网站以下载音乐,但遇到了问题:使用urllib3发起请求时始终返回502 Bad Gateway错误,不过通过浏览器可正常访问该网站。我试图访问的URL为http://zk.fm/mp3/search?keywords=加上歌曲名和歌手关键词,例如http://zk.fm/mp3/search?keywords=childish+gambino+heartbeat。

以下是我的代码(带有随机伪造User-Agent):

from bs4 import BeautifulSoup
from random import choice
import urllib3

desktop_agents = [
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14',
    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'
]

def random_headers():
    return {'User-Agent': choice(desktop_agents)}

ua = random_headers()
http = urllib3.PoolManager(10, headers=user_agent)
response = http.request('GET', "http://zk.fm/mp3/search? keywords=childish+gambino+heartbeat")
soup = BeautifulSoup(response.data)

请问是否有办法解决该502错误,还是此问题无法由我控制?


解决思路与方案

先给你梳理下可能的问题和对应的解决办法,大部分情况都是可以通过调整代码解决的:

1. 先修复代码里的低级错误

  • 变量名拼写错误:你定义了ua = random_headers(),但初始化PoolManager时用的是headers=user_agent——这个user_agent变量根本没定义!应该改成headers=ua才对,不然请求头根本没带上你随机生成的User-Agent,网站一眼就能识别出是爬虫。
  • URL里的无效空格:你的请求URL里有个空格? keywords=...,浏览器会自动忽略这个空格,但urllib3会把它当成URL的一部分,直接导致请求路径错误,赶紧把空格去掉,改成http://zk.fm/mp3/search?keywords=childish+gambino+heartbeat。

2. 模拟更真实的浏览器请求

网站反爬不止看User-Agent,还会检查请求头的完整性,你可以补充更多浏览器常用的请求头,让请求更“像人”:

def random_headers():
    return {
        'User-Agent': choice(desktop_agents),
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Referer': 'http://zk.fm/',
        'Connection': 'keep-alive'
    }

3. 应对IP限制

如果网站检测到单一IP频繁请求,可能会返回502拦截你:

  • 可以添加请求延迟,每次请求后暂停1-2秒,模拟人类浏览节奏:
    import time
    # 请求后加延迟
    time.sleep(2)
    
  • 试试使用代理IP,urllib3的ProxyManager可以帮你实现:
    http = urllib3.ProxyManager('http://你的代理IP:端口/', headers=ua)
    

4. 进阶方案:模拟浏览器会话

如果以上方法都没用,可能网站需要Cookie验证或者更复杂的行为模拟,你可以换成requests库配合Session保存Cookie,或者用selenium直接驱动真实浏览器,这样绕过反爬的概率会高很多。

什么时候是无法控制的情况?

如果调整完所有代码,还是返回502,那可能是网站的服务器或CDN临时故障,或者他们的反爬机制已经升级到很难绕过的程度(比如需要验证码、登录验证),这种情况下就暂时没办法了,只能等网站恢复或者换其他资源站试试。

内容的提问来源于stack exchange,提问作者C. De Petter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:21