向apartments.com发送GET请求超时但网站未宕机的技术求助
问题:请求apartments.com超时挂起,浏览器正常但Python/curl失败
我尝试向apartments.com发送GET请求,但请求始终超时或挂起。该页面在浏览器中加载正常,说明Web服务器并未宕机。
作为Web开发者,我常使用requests模块,也搭建过Web服务器,认知里除非服务器宕机,否则总会返回内容——就算缺请求头或Cookie,至少也会收到403错误。
其他网站均可正常访问,且问题在不同机器、不同网络环境下都出现,所以大概率和防火墙或网络连接无关。Python和curl都会触发这个错误,该怎么解决?
我的Python代码如下:
import requests import datetime # 原代码遗漏导入,此处补充 url = "https://www.apartments.com/" # 该域名下任意路径都存在此问题 escaped_time_string = datetime.datetime.now().strftime("%a+%b+%d+%Y+%H___%M___%S+GMT-0600+(Mountain+Daylight+Time)").replace("___", "%3A") print(escaped_time_string) headers = { # 这些是浏览器访问时发送的请求头,我试过其他User-Agent,无效果 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0", "Host": "www.apartments.com", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate, br, zstd", "Connection": "keep-alive", "Cookie": f"cb=1; cul=en-US; ab=%7b%22e%22%3atrue%2c%22r%22%3a%5b%5d%7d; afe=%7b%22e%22%3afalse%7d; fso=%7b%22e%22%3afalse%7d; sr=%7B%22Width%22%3A2560%2C%22Height%22%3A1279%2C%22PixelRatio%22%3A1%7D; _ga=GA1.2.1587172952.1719086370; _gid=GA1.2.2141307871.1719086370; OptanonConsent=isGpcEnabled=0&datestamp={escaped_time_string}&version=202401.2.0&browserGpcFlag=0&isIABGlobal=false&hosts=&consentId=7bc5ce4e-ac96-493a-bcbb-c4a1f2084786&interactionCount=1&landingPath=NotLandingPage&groups=C0001%3A1%2CC0003%3A1%2CC0002%3A1%2CC0004%3A1&AwaitingReconsent=false; gip=%7b%22Display%22%3a%22Orem%2c+UT%22%2c%22GeographyType%22%3a2%2c%22Address%22%3a%7b%22City%22%3a%22Orem%22%2c%22CountryCode%22%3a%22US%22%2c%22State%22%3a%22UT%22%7d%2c%22Location%22%3a%7b%22Latitude%22%3a40.3142%2c%22Longitude%22%3a-111.7099%7d%2c%22IsPmcSearchByCityState%22%3afalse%7d; akaalb_www_apartments_com_main=1719122615~op=apartments_Prd_Edge_US:www_apartments_com_LAX|~rv=77~m=www_apartments_com_LAX:0|~os=0847b47fe1c72dfaedb786f1e8b4b630~id=6fe4004a168575354c8284d8b9dcdec9; ak_bmsc=58307435F65C23FE0EBD31E15CF76945~000000000000000000000000000000~YAAQRqfLF+IFxjaQAQAApWx6Qxji3KakC+xNTdsIM+85gJPMwEo498Se+B3+ugjIZV6wiX2p63okc8LKIQYXV3UJjNcRZe05q8LM3FXGCivYqWKHk1795v1Ismu17ai6hO2NRmiHUnW7LM9WHwZsYyJFqGGeRfs9K2JX3abwcljSCXK55n2XBmdryImrz93faWCWIJqy3fCyQGGJoh8iScFiiegqL4zJg14yojxdLOBSJsVXPBnH0F2uLcs5rNpkgGZ/88uFKf66BOU340ir2Yr9QNi3CV5+90STD0hHITUhbIoG7l5Oc7991FZYZFUrj1IWT9vxnwyJOk76yYqdkN5oRuT3GO1WsPZDXp/7sh6e9gSDsAcQRdhIO3eLP4p6A5fkzc5hqogez5F01U4=; _gat=1; bm_sv=F96ACBC1FDF433C48190DCBABDE1376B~YAAQRqfLFx0GxjaQAQAAdm96QxjvIM6idZiwJvdJ3swWH5GcroUfVp9H3HRvvKzoNhUaYrtPnpUOjnfNVrLvVCN+PZNmaO/efw9Id7eOmJ9nDqVBI7g4q1+S4Y7YYd9mmE1wXAy6fgIEBW4I0aD2vfMXXs768jB4P2D26X94iUlSYjZyWSDqVP3p2oBHV+/TUUwU91FAJMXON8j+hMPXaWF74ogpw4kEWWKme2ireco1yRfqVEeRxXShohFdbhheFWgbwg==~1", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Sec-Fetch-User": "?1", "Priority": "u=1", "TE": "trailers" } req = requests.get(url, timeout=10, allow_redirects=True, headers=headers) req = None try: req = requests.get(url, timeout=10, allow_redirects=True) except requests.exceptions.Timeout: print("Timed out") if req: print(req.text)
以下curl命令也会出现相同问题:
curl https://apartments.com
浏览器每次访问页面时,大部分请求头保持不变,但Cookie头中有部分内容会每次变化——包含当前时间,这点容易处理,但还有bm_sv和bm_mi的值。我对Cookie经验不多,但它们似乎包含位置数据,可能是问题所在。
解决建议
1. 核心原因:反爬系统静默拦截请求
apartments.com使用了Akamai这类CDN/反爬服务商,这类系统不会返回403,而是直接静默丢弃请求,让连接超时挂起,以此区分自动化工具和真实浏览器。这就是你看不到错误码的原因。
2. 关键问题:复用旧Cookie无效
你复制的bm_sv、bm_mi是Akamai生成的会话验证Cookie,时效性极强,且和浏览器的TLS指纹、JS运行环境绑定。直接复用旧Cookie不仅无效,反而会触发反爬规则。
3. 可行解决方案
- 优先用浏览器自动化工具:Selenium、Playwright这类工具会模拟完整的浏览器环境,自动处理JS执行、Cookie维护、TLS指纹匹配,完全规避这类反爬。示例代码(Playwright):
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.firefox.launch() page = browser.new_page() page.goto("https://www.apartments.com/") print(page.content()) browser.close()
- 不要手动拼接Cookie:自动化工具会自动生成并维护有效会话Cookie,不需要你手动复制旧值。
- 若坚持用requests:可以尝试
curl_cffi这类库模拟浏览器TLS指纹,但维护成本高,Akamai很容易更新规则识别这类模拟。 - 控制请求频率:就算用自动化工具,也要添加随机延迟,避免短时间内大量请求触发封禁。
4. 为什么curl也失败?
curl默认的请求头、TLS指纹和浏览器差异极大,直接请求会被Akamai拦截。即使添加浏览器请求头,也因为缺少JS执行环节,无法通过环境验证,最终还是会被静默丢弃。
内容的提问来源于stack exchange,提问作者Sam Hill
相关产品推荐
相关产品推荐

