使用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
相关产品推荐
相关产品推荐

