Selenium+Heroku部署爬取网站时遭遇Access Denied问题求助
Heroku部署无头Chrome爬取网站时的Access Denied问题
问题背景
我用Selenium爬取某保险公司网站(amil.com.br),通过用户凭证登录查看退款状态。本地运行正常,本地切换无头Chrome时,仅修改User-Agent就能恢复正常。但部署到Heroku后,即使修改了User-Agent并确认请求不含Headless标识,仍持续收到"Access Denied"错误。已通过print(driver.execute_script("return navigator.userAgent"))验证UA为合法无Headless标识的值,但问题依旧。
配置代码与错误日志
Chrome配置代码
options = webdriver.ChromeOptions() options.binary_location = os.environ.get("GOOGLE_CHROME_BIN") options.add_argument("--headless") options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") options.add_experimental_option('excludeSwitches', ['enable-logging']) user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' options.add_argument('user-agent={0}'.format(user_agent)) service = Service(executable_path=os.environ.get("CHROMEDRIVER_PATH")) driver = webdriver.Chrome(service=service, options=options) return driver
错误日志输出
2023-07-04T20:29:41.593956+00:00 app[web.1]: <html><head> 2023-07-04T20:29:41.593975+00:00 app[web.1]: <title>Access Denied</title> 2023-07-04T20:29:41.593975+00:00 app[web.1]: </head><body> 2023-07-04T20:29:41.593976+00:00 app[web.1]: <h1>Access Denied</h1> 2023-07-04T20:29:41.593976+00:00 app[web.1]: 2023-07-04T20:29:41.593976+00:00 app[web.1]: You don't have permission to access "http://www.amil.com.br/beneficiario/" on this server.<p> 2023-07-04T20:29:41.593977+00:00 app[web.1]: Reference #18.cd4fde17.1688502581.2beed326 2023-07-04T20:29:41.593977+00:00 app[web.1]: 2023-07-04T20:29:41.593977+00:00 app[web.1]: 2023-07-04T20:29:41.593978+00:00 app[web.1]: </p></body></html> 2023-07-04T20:29:41.598474+00:00 app[web.1]: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36
解决建议
补充反检测参数:网站可能通过Selenium自动化特征识别爬虫,添加以下参数隐藏自动化标识:
options.add_argument("--disable-blink-features=AutomationControlled") options.add_experimental_option("useAutomationExtension", False) options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_argument("--window-size=1920,1080") # 模拟真实窗口尺寸完善请求头信息:除User-Agent外,补充正常访问时的其他关键请求头(如语言、来源页),通过CDP命令添加:
driver.execute_cdp_cmd('Network.setExtraHTTPHeaders', { 'headers': { 'Accept-Language': 'pt-BR,pt;q=0.9', 'Referer': 'http://www.amil.com.br/' } })确认Chrome与Chromedriver版本兼容:Heroku上的Chrome二进制文件和Chromedriver版本不匹配可能导致异常,检查日志中的版本信息,确保两者版本一致。
改用undetected-chromedriver:该库针对反爬优化,自动处理指纹特征,替换原有驱动初始化:
from undetected_chromedriver import Chrome, ChromeOptions options = ChromeOptions() options.binary_location = os.environ.get("GOOGLE_CHROME_BIN") options.add_argument("--headless") options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' options.add_argument(f'user-agent={user_agent}') driver = Chrome(options=options, executable_path=os.environ.get("CHROMEDRIVER_PATH"))检查Heroku IP是否被拉黑:Heroku的共享IP可能被目标网站拦截,尝试添加代理IP:
options.add_argument('--proxy-server=http://your-proxy-ip:port')
内容的提问来源于stack exchange,提问作者Pedro Fontes
相关产品推荐
相关产品推荐

