Google Colab và Jupyter Notebook là những công cụ tiện lợi để viết và chạy các kịch bản phân tích nhanh chóng mà không cần cài đặt Python trên máy tính cục bộ. Nhưng các notebook đám mây có một đặc điểm mà thường bị bỏ qua: tất cả các yêu cầu đều đến từ địa chỉ IP của các trung tâm dữ liệu Google, đã được các hệ thống chống bot biết đến từ lâu và bị cấm gần như ngay lập tức. Trong bài viết này, chúng ta sẽ xem xét cách kết nối proxy đúng cách trong Colab và Jupyter, những hạn chế mà môi trường đám mây đặt ra và cách thiết lập phân tích sao cho không bị ngắt quãng sau 50 yêu cầu đầu tiên.
Tại sao Google Colab bị cấm thường xuyên hơn so với máy tính thông thường
Vấn đề chính của Colab cho phân tích là bể IP chung. Mỗi khi bạn khởi động notebook, Google sẽ cấp phát một máy ảo với IP từ các dải đám mây của họ (AS15169 và những cái tương tự). Những dải này đã được đưa vào danh sách đen của hầu hết các hệ thống chống bot: Cloudflare, DataDome, PerimeterX, cũng như các biện pháp bảo vệ tích hợp của Wildberries, Ozon và các sàn thương mại điện tử nhận diện chúng trong tích tắc. Yêu cầu thậm chí không đến được trang web — nó bị chặn bởi bộ lọc theo ASN (Số Hệ Thống Tự Trị) trước khi kiểm tra User-Agent hoặc hành vi.
Lý do thứ hai là sự phổ biến của việc sử dụng. Hàng ngàn nhà phát triển cùng lúc chạy các trình phân tích, bot và kịch bản ML qua Colab, vì vậy danh tiếng của các IP này với nhiều trang web mục tiêu đã bị "đốt cháy" từ lâu trước khi yêu cầu của bạn được gửi đi. Ngay cả khi bạn thực hiện một yêu cầu GET cẩn thận mỗi 10 giây, trang web có thể trả về 403 chỉ vì từ cùng một dải IP một giờ trước, ai đó đã tấn công máy chủ với 500 luồng.
Lý do thứ ba là Jupyter, khi chạy cục bộ, thường không gặp phải vấn đề này (nếu bạn có một IP gia đình hoặc văn phòng thông thường), nhưng khi bắt đầu làm việc qua JupyterHub trên máy chủ lưu trữ hoặc trong container của nhà cung cấp đám mây — tình hình trở nên giống như trong Colab. Do đó, câu hỏi "cần proxy hay không" cho các notebook đám mây được giải quyết một cách rõ ràng: không có chúng, phân tích gần như không hoạt động sau vài yêu cầu đầu tiên.
Loại proxy nào phù hợp cho phân tích đám mây
Việc lựa chọn loại proxy phụ thuộc vào những gì bạn đang phân tích và mức độ bảo vệ của trang web mục tiêu. Đối với Colab và Jupyter, cần lưu ý thêm một điểm: phiên làm việc của notebook có giới hạn về thời gian, vì vậy các phiên sticky lâu dài của proxy không phải lúc nào cũng quan trọng — thường thì độ ổn định của kết nối trong một lần chạy là điều quan trọng hơn.
| Loại proxy | Khi nào sử dụng trong Colab/Jupyter | Đặc điểm |
|---|---|---|
| Proxy trung tâm dữ liệu | Phân tích các trang web không có bảo vệ nghiêm ngặt, API mở, trang tĩnh | Tốc độ cao, giá thấp, nhưng cũng có thể bị cấm theo ASN trên các trang web hung hãn |
| Proxy cư trú | Phân tích Wildberries, Ozon, Avito, Google, mạng xã hội với bảo vệ chống bot | IP của người dùng thực, hiếm khi bị đưa vào danh sách đen, độ trễ cao hơn |
| Proxy di động | Phân tích các phiên bản di động của trang web, TikTok, Instagram qua API | Độ tin cậy cao nhất, nhưng đắt hơn và tốc độ xoay vòng chậm hơn |
Đối với hầu hết các nhiệm vụ phân tích các sàn thương mại điện tử và công cụ tìm kiếm từ Colab, sự kết hợp giữa proxy cư trú với việc xoay vòng theo từng yêu cầu sẽ là sự cân bằng tối ưu — điều này giảm khả năng bị cấm theo mẫu hành vi, ngay cả khi yêu cầu được thực hiện từ môi trường đám mây của Google.
Cài đặt proxy trong requests và urllib
Cài đặt cơ bản proxy trong Colab không khác gì so với môi trường Python cục bộ. Sự khác biệt chỉ là trong Colab, các thư viện thường cần được cài đặt thêm qua !pip install, vì hình ảnh tiêu chuẩn không phải lúc nào cũng chứa tất cả những gì cần thiết.
!pip install requests
import requests
proxy = {
"http": "http://login:[email protected]:9000",
"https": "http://login:[email protected]:9000"
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(
"https://example.com/catalog",
proxies=proxy,
headers=headers,
timeout=15
)
print(response.status_code)
print(response.text[:500])
Một điểm quan trọng: trong Colab không có tệp cấu hình cố định, vì vậy tên đăng nhập và mật khẩu của proxy phải được mã hóa cứng (điều này không an toàn khi công bố notebook), hoặc lưu trữ trong các biến môi trường Colab thông qua google.colab.userdata, hoặc kết nối thông qua Colab Secrets. Điều này tiện lợi hơn so với việc lưu trữ mật khẩu trực tiếp trong mã, đặc biệt nếu bạn chia sẻ notebook với đồng nghiệp.
from google.colab import userdata
proxy_login = userdata.get('PROXY_LOGIN')
proxy_pass = userdata.get('PROXY_PASS')
proxy_url = f"http://{proxy_login}:{proxy_pass}@gate.proxycove.com:9000"
proxies = {"http": proxy_url, "https": proxy_url}
Proxy với Selenium và Chrome headless trong Colab
Nếu trang web render nội dung qua JavaScript (tình huống điển hình cho Wildberries, Ozon, Avito), chỉ sử dụng requests là không đủ — cần một trình duyệt headless. Trong Colab, điều này thường là Selenium với Chromium, mà bạn cần cài đặt thủ công, vì nó không có trong hình ảnh cơ bản.
!apt-get update
!apt install chromium-chromedriver
!pip install selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--proxy-server=http://gate.proxycove.com:9000')
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://example.com/catalog")
print(driver.page_source[:500])
driver.quit()
Vấn đề là cờ --proxy-server không hỗ trợ xác thực bằng tên đăng nhập và mật khẩu trực tiếp. Đối với proxy có xác thực trong Selenium, bạn cần sử dụng xác thực IP (whitelisting theo IP tĩnh của notebook, điều này không ổn định trong Colab vì IP của máy thay đổi mỗi lần khởi động mới), hoặc tạo một tiện ích mở rộng Chrome "trong thời gian" với thông tin đăng nhập proxy, hoặc sử dụng một tunnel proxy thông qua thư viện như selenium-wire, hỗ trợ proxy đã xác thực ngay từ đầu.
!pip install selenium-wire
from seleniumwire import webdriver
proxy_options = {
'proxy': {
'http': 'http://login:[email protected]:9000',
'https': 'http://login:[email protected]:9000',
}
}
driver = webdriver.Chrome(seleniumwire_options=proxy_options, options=chrome_options)
driver.get("https://example.com/catalog")
Jupyter Notebook: cục bộ vs đám mây
Jupyter Notebook, khi chạy trên máy tính cục bộ (thông qua Anaconda hoặc trực tiếp qua pip), sử dụng địa chỉ IP gia đình hoặc văn phòng của bạn — và trong trường hợp này, proxy chỉ cần thiết để che giấu hoặc vượt qua các hạn chế địa lý, chứ không phải để cứu khỏi việc bị cấm theo ASN của trung tâm dữ liệu. Cài đặt trong trường hợp này hoàn toàn giống với một kịch bản Python thông thường: cùng một requests, cùng một Selenium, không có hạn chế về việc cài đặt driver và gói hệ thống.
Tình hình thay đổi nếu bạn sử dụng Jupyter qua dịch vụ đám mây: JupyterHub trên VPS, Kaggle Notebooks, Deepnote, Binder hoặc cụm đám mây doanh nghiệp. Trong những trường hợp này, IP lại thuộc về trung tâm dữ liệu của nhà cung cấp, và tất cả các vấn đề của Colab đều áp dụng một cách chính xác. Điểm khác biệt chính so với Colab là các dịch vụ như vậy thường có IP ổn định hơn trong suốt phiên (không thay đổi khi mỗi lần khởi động lại kernel), điều này đơn giản hóa việc thiết lập whitelisting theo IP, nếu nhà cung cấp proxy của bạn hỗ trợ điều đó.
Kết luận thực tiễn: nếu phân tích là điều quan trọng cho doanh nghiệp (ví dụ, theo dõi giá hàng ngày của đối thủ trên các sàn thương mại điện tử), tốt hơn là không nên gắn bó với các notebook đám mây miễn phí như một môi trường sản xuất, mà chỉ sử dụng chúng cho việc phát triển và thử nghiệm kịch bản, chuyển trình phân tích cuối cùng lên máy chủ với IP cố định và proxy đã được thiết lập.
Hạn chế của các notebook đám mây làm hỏng phân tích
Ngoài các vấn đề với danh tiếng IP, Google Colab còn có một số hạn chế kỹ thuật ảnh hưởng trực tiếp đến độ ổn định của phân tích:
- Thời gian chờ không hoạt động. Phiên bản miễn phí của Colab tắt notebook sau ~90 phút không hoạt động và buộc phải kết thúc phiên sau 12 giờ làm việc liên tục — việc phân tích hàng ngàn trang cần phải được chia thành các phần hoặc lưu trữ kết quả trung gian trên Google Drive.
- Thay đổi IP khi mỗi lần chạy mới. Nếu bạn tắt và kết nối lại môi trường thực thi, địa chỉ IP của máy ảo sẽ thay đổi — điều này làm hỏng bất kỳ thiết lập nào với whitelisting theo IP ở phía dịch vụ proxy.
- Giới hạn kết nối đầu ra. Google giới hạn số lượng kết nối mạng đồng thời từ một máy ảo, vì vậy đa luồng hung hãn với hàng chục yêu cầu song song có thể gặp giới hạn không phải từ việc chặn trang web, mà từ giới hạn của chính Colab.
- Không có lưu trữ liên tục mà không gắn đĩa. Cookies, phiên trình duyệt và bộ nhớ cache của các kết nối proxy sẽ biến mất khi mỗi lần khởi động lại — để phân tích có xác thực, cần phải lưu cookies vào tệp trên Google Drive.
- Độ trễ mạng không thể đoán trước. Hạ tầng đám mây của Google đôi khi gây ra sự tăng vọt về độ trễ, do đó thời gian chờ của các yêu cầu cần được đặt với một khoảng thời gian dự phòng (15-30 giây thay vì 5-10 giây tiêu chuẩn).
Những hạn chế này làm cho Colab là một công cụ tuyệt vời cho việc phát triển và gỡ lỗi logic của trình phân tích, nhưng không phù hợp cho các nhiệm vụ sản xuất kéo dài — cho chúng, tốt hơn là chuyển kịch bản hoàn chỉnh lên VPS hoặc máy chủ riêng với IP của riêng bạn.
Xoay vòng proxy và xử lý lỗi trong vòng lặp
Để phân tích không bị ngắt quãng khi bị chặn lần đầu tiên, mã cần có logic thử lại với việc thay thế proxy. Dưới đây là ví dụ về một vòng lặp đơn giản với việc xoay vòng và xử lý lỗi, có thể chạy ngay trong Colab.
import requests
import time
import random
proxy_pool = [
"http://login:[email protected]:9000",
"http://login:[email protected]:9001",
"http://login:[email protected]:9002",
]
def get_with_retry(url, max_retries=5):
for attempt in range(max_retries):
proxy_url = random.choice(proxy_pool)
proxies = {"http": proxy_url, "https": proxy_url}
try:
response = requests.get(url, proxies=proxies, timeout=20)
if response.status_code == 200:
return response
else:
print(f"Thử {attempt+1}: trạng thái {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Thử {attempt+1}: lỗi {e}")
time.sleep(random.uniform(2, 5))
return None
result = get_with_retry("https://example.com/catalog")
if result:
print(result.status_code)
else:
print("Tất cả các thử nghiệm đã hết")
Đối với việc phân tích các danh mục lớn (ví dụ, hàng ngàn thẻ sản phẩm trên Wildberries), logic này thường được bao bọc thêm trong hàng đợi tác vụ với thời gian nghỉ giữa các yêu cầu và lưu trữ kết quả trung gian trong CSV hoặc cơ sở dữ liệu trực tiếp trên Google Drive, để không mất tiến trình khi phiên Colab bị ngắt.
Danh sách kiểm tra trước khi chạy trình phân tích trong Colab
- Proxy đã được kết nối và kiểm tra bằng một yêu cầu thử nghiệm riêng trước vòng lặp chính
- Tên đăng nhập và mật khẩu của proxy được lưu trữ trong Colab Secrets, không phải trong mã công khai
- Đối với các trang JS, sử dụng Selenium với selenium-wire hoặc tiện ích mở rộng xác thực đã được chỉ định
- Trong mã có logic thử lại và xoay vòng proxy khi gặp lỗi 403/429
- Kết quả trung gian được lưu trữ trên Google Drive sau mỗi N bản ghi
- Thời gian chờ của các yêu cầu đã được tăng lên với sự xem xét các độ trễ có thể xảy ra của mạng đám mây
- Độ song song của các yêu cầu được giới hạn để không gặp giới hạn kết nối đầu ra của Colab
- Đối với các nhiệm vụ sản xuất, có kế hoạch chuyển kịch bản lên máy chủ riêng với IP cố định
Kết luận
Google Colab và Jupyter đám mây rất phù hợp cho việc phát triển nhanh chóng và thử nghiệm logic của trình phân tích, nhưng do các IP chung của trung tâm dữ liệu gần như luôn yêu cầu proxy ngay từ những bước đầu tiên. Đối với các trang web đơn giản không có bảo vệ hung hãn, proxy trung tâm dữ liệu là đủ, trong khi cho việc phân tích các sàn thương mại điện tử, công cụ tìm kiếm và mạng xã hội, các IP cư trú và di động hoạt động đáng tin cậy hơn, ít bị lọc theo ASN.
Nếu bạn dự định theo dõi giá thường xuyên trên Wildberries hoặc Ozon trực tiếp từ Colab, chúng tôi khuyên bạn nên bắt đầu với proxy cư trú — chúng cung cấp quyền truy cập ổn định mà không bị chặn thường xuyên, còn đối với các kịch bản thử nghiệm một lần, bạn có thể sử dụng các proxy trung tâm dữ liệu giá rẻ hơn, kết nối chúng theo cùng một cách thông qua requests hoặc Selenium.