如何用Selenium/undetected-selenium绕过Facebook广告库IP封禁(AWS部署)
问题描述
我正在开展一个项目,需要爬取Facebook广告库的数据并上传至AWS服务器。已使用Selenium和undetected-selenium搭建网页爬虫,但遇到Facebook临时封禁IP的问题,提示信息为:
You’re Temporarily Blocked
It looks like you were misusing this feature by going too fast. You’ve been temporarily blocked from using it.
发现即使启用VPN的Chrome隐私窗口,或为Chrome Driver配置代理,仍会收到该封禁提示,仅切换回住宅IP时封禁才会解除。希望在使用Selenium或undetected-selenium与Facebook交互时,实现IP地址的伪装或隐藏,同时将脚本部署在AWS服务器上,但AWS默认IP无法正常运行。
参考代码:
import chromedriver_autoinstaller import undetected_chromedriver as uc import time options = uc.ChromeOptions() options.add_argument("--disable-notifications") options.add_argument('--allow-running-insecure-content') options.add_argument('--ignore-certificate-errors') options.add_argument('--disable-application-cache') options.add_argument("--disable-setuid-sandbox") options.add_argument("--window-size=1920,1080") options.add_argument("--disable-dev-shm-usage") options.add_argument("--disable-infobars") options.add_argument("--mute-audio") options.add_argument("--disable-gpu") options.add_argument("--no-sandbox") PROXY = "IP:PORT" options.add_argument("--proxy-server=%s" % PROXY) version_main = int(chromedriver_autoinstaller.get_chrome_version().split(".")[0]) driver = uc.Chrome(options=options, version_main=version_main) driver.get("https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=ALL&q=restaurants&sort_data[""direction"]=desc&sort_data[mode]=relevancy_monthly_grouped&search_type=keyword_unordered&media_type=all") # Wait to see the error time.sleep(10) driver.quit()
解决方案
1. 改用住宅代理IP
Facebook对数据中心IP(包括AWS云IP、普通VPN IP)的检测极严,这类IP通常被标记为高风险爬虫来源。你已验证住宅IP可正常访问,因此核心方案是切换到带用户名密码认证的住宅代理服务:
- 避免使用仅提供
IP:PORT的无认证代理,这类代理易被多人共享导致集体封禁 - 通过Chrome扩展实现代理认证,示例代码如下:
import zipfile import undetected_chromedriver as uc def create_proxy_auth_extension(proxy_host, proxy_port, proxy_username, proxy_password): manifest_json = """ { "version": "1.0.0", "manifest_version": 2, "name": "Proxy Auth", "permissions": ["proxy", "tabs", "<all_urls>", "webRequest", "webRequestBlocking"], "background": {"scripts": ["background.js"]} } """ background_js = f""" var config = {{ mode: "fixed_servers", rules: {{ singleProxy: {{scheme: "http", host: "{proxy_host}", port: parseInt({proxy_port})}}, bypassList: ["localhost"] }} }}; chrome.proxy.settings.set({{value: config, scope: "regular"}}, () => {{}}); chrome.webRequest.onAuthRequired.addListener( details => {{ return {{authCredentials: {{username: "{proxy_username}", password: "{proxy_password}"}}}}; }}, {{urls: ["<all_urls>"]}}, ['blocking'] ); """ with zipfile.ZipFile("proxy_auth.zip", 'w') as zp: zp.writestr("manifest.json", manifest_json) zp.writestr("background.js", background_js) return "proxy_auth.zip" # 初始化配置 options = uc.ChromeOptions() proxy_ext = create_proxy_auth_extension("你的代理IP", "端口", "用户名", "密码") options.add_extension(proxy_ext) # 保留你原有的其他options配置 driver = uc.Chrome(options=options, version_main=version_main)
2. 模拟真实用户行为
Facebook的封禁逻辑不仅依赖IP,还会检测操作模式:
- 移除
--no-sandbox这类可能暴露爬虫的参数(undetected-chromedriver默认已做自动化特征隐藏,无需额外添加异常参数) - 替换固定延迟为随机延迟:用
time.sleep(random.uniform(3, 8))替代time.sleep(10),模拟用户浏览停顿 - 添加真实操作模拟:访问页面后执行JavaScript滚动页面、随机点击页面空白区域,避免直接批量爬取
- 控制请求频率:每分钟最多发起5-10个请求,避免短时间内大量触发速率限制
3. AWS部署优化
- 不要直接使用AWS默认公网IP,所有请求通过住宅代理转发
- 为AWS实例分配弹性IP,避免频繁更换IP引发额外检测
- 选择与住宅代理IP区域接近的AWS实例区域,降低网络延迟,减少被检测概率
4. IP轮换与封禁处理
- 建立住宅IP池,每完成一定数量的页面爬取后自动切换IP
- 若触发封禁提示,立即切换IP并延长延迟时间(比如暂停15-30分钟),再恢复请求
内容的提问来源于stack exchange,提问作者Abdul Moez
相关产品推荐
相关产品推荐

