如何在Colab中用Selenium绕过Cloudflare提取44K JSON数据?
问题
需要高效提取https://www.kartanarusheniy.org/messages页面展示的数据,这些数据来自约44K个JSON文件,可通过ID号访问https://www.kartanarusheniy.org/api/messages/{ID}接口获取(例如https://www.kartanarusheniy.org/api/messages/1、https://www.kartanarusheniy.org/api/messages/3)。但该站点有Cloudflare防护,直接下载无法实现。
已尝试在Google Colab上运行Selenium代码:
!apt update !apt install chromium-chromedriver !cp /usr/lib/chromium-browser/chromedriver /usr/bin !pip install selenium from selenium import webdriver import pandas as pd options = webdriver.ChromeOptions() options.add_argument("--headless") options.add_argument('--no-sandbox') options.add_argument("--enable-javascript") options.add_argument('--disable-dev-shm-usage') options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options) i = 1 while i < 10: url = "https://www.kartanarusheniy.org/api/messages" + str(i) filename = str(i) + ".json" #session_obj = requests.Session () getter = driver.get(url) saver = driver.page_source print(saver) i += 1
运行后得到Cloudflare安全验证页面,提示“Checking if the site connection is secure”“Enable JavaScript and cookies to continue”。此外还尝试过undetected_chromedriver和selenium_stealth工具,但仍无法绕过防护。
可行解决方案
使用Playwright模拟真实浏览器行为
普通Selenium类工具在Colab环境下的特征容易被识别,试试Playwright——它默认会模拟更贴近真实用户的浏览器指纹,包括随机化行为特征。在Colab中安装后,配置合理的浏览器参数并添加等待时间,让Cloudflare验证流程完成。示例代码框架:!pip install playwright !playwright install chromium from playwright.sync_api import sync_playwright import time with sync_playwright() as p: browser = p.chromium.launch(headless=True, args=["--no-sandbox", "--disable-dev-shm-usage"]) context = browser.new_context( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", viewport={"width": 1920, "height": 1080} ) page = context.new_page() for i in range(1, 10): url = f"https://www.kartanarusheniy.org/api/messages/{i}" page.goto(url) # 等待Cloudflare验证完成,可根据页面状态调整等待逻辑 page.wait_for_load_state("networkidle") time.sleep(2) content = page.content() # 处理并保存JSON内容 print(content) browser.close()尝试合规数据获取渠道
查看站点是否提供官方API密钥、数据导出服务或开放数据接口,很多站点会对合规的数据请求开放权限。可以检查站点的robots.txt文件、开发者文档,或直接联系站点管理员确认合法获取数据的途径,这是最稳定且无风险的方式。住宅代理+请求库组合
使用住宅代理(而非数据中心代理)搭配requests或httpx库,每次请求随机化请求头(User-Agent、Accept等),并添加随机延迟模拟人类访问节奏。示例:import requests import random import time proxies = { "http": "http://你的住宅代理地址:端口", "https": "https://你的住宅代理地址:端口" } user_agents = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15", # 补充更多真实用户的User-Agent ] for i in range(1, 10): headers = { "User-Agent": random.choice(user_agents), "Accept": "application/json, text/javascript, */*; q=0.01", "Referer": "https://www.kartanarusheniy.org/messages" } url = f"https://www.kartanarusheniy.org/api/messages/{i}" try: response = requests.get(url, headers=headers, proxies=proxies) if response.status_code == 200: print(response.json()) else: print(f"ID {i} 请求失败,状态码: {response.status_code}") except Exception as e: print(f"ID {i} 请求出错: {e}") time.sleep(random.uniform(1, 3))本地环境运行爬虫
Colab的服务器环境特征容易被Cloudflare标记为非人类访问,换成本地电脑运行undetected_chromedriver或Playwright,本地环境的浏览器指纹更接近真实用户,绕过验证的成功率更高。可以先手动完成一次Cloudflare验证,再复用验证后的Cookie批量请求接口。
内容的提问来源于stack exchange,提问作者Octner

