🎯 Trình duyệt đám mây tùy chỉnh, chống phát hiện được hỗ trợ bởi Chromium tự phát triển, thiết kế dành cho trình thu thập dữ liệu webtác nhân AI. 👉Dùng thử ngay
Quay lại blog

Cách lấy dữ liệu từ Iframes với Playwright và Scrapeless

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

30-Jul-2026

Tóm tắt:

  • Một iframe chứa một tài liệu riêng biệt mà các bộ chọn trang cha không thể tìm kiếm. Hãy chọn khung con trước khi định vị hoặc lấy các phần tử của nó.
  • Playwright hiển thị mọi ngữ cảnh duyệt web qua page.frames. Xác định khung con mong muốn bằng tên ổn định, mẫu URL, hoặc phần tử iframe sở hữu thay vì dựa vào vị trí trong mảng.
  • FrameFrameLocator phục vụ cho các nhu cầu trích xuất khác nhau. Sử dụng Frame cho metadata và kiểm soát vòng đời; sử dụng FrameLocator cho các hành động phần tử ngắn gọn.
  • Playwright có thể tự động hóa nội dung iframe chéo nguồn thông qua giao thức của trình duyệt. JavaScript trong trang vẫn phải tuân theo chính sách cùng nguồn của trình duyệt.
  • Logic trích xuất iframe giống nhau hoạt động cả ở chế độ địa phương và qua Scrapeless. Chuyển sang Scrapeless Scraping Browser thay đổi việc tạo trình duyệt, không phải mã chọn khung hoặc định vị.
  • Miễn phí để bắt đầu. Tài khoản Scrapeless mới bao gồm thời gian chạy Scraping Browser miễn phí—đăng ký tại app.scrapeless.com.

Giới thiệu: Bắt đầu với Tài liệu Đúng

Một iframe là một tài liệu riêng biệt có URL, vòng đời và DOM của riêng mình. Hướng dẫn này sử dụng Playwright để liệt kê các ngữ cảnh duyệt web trên một trang thực, xác định khung con mong muốn bằng tên và URL, và trích xuất một mẫu biểu mà một bộ chọn trang cha không thể nhìn thấy. Logic khung tương tự chạy sau khi kết nối Playwright với Scrapeless Scraping Browser.

Tại sao Iframe Cần Một Đường Trích Xuất Khác

Một <iframe> nhúng một ngữ cảnh duyệt web khác bên trong trang cha. Phần tử thuộc về DOM cha; tài liệu đã tải thuộc về khung con. Một bộ chọn được đánh giá trên trang cha không tìm kiếm tài liệu con đó.

HTML iframe reference mô tả ngữ cảnh lồng nhau đó và lịch sử phiên của nó. Playwright hiển thị mỗi ngữ cảnh dưới dạng một Frame, trong khi FrameLocator cung cấp cho bạn một cách ngắn gọn để định vị các phần tử thông qua phần tử <iframe>.

Tại sao Sử Dụng Playwright Với Scrapeless

Playwright có thể kiểm tra metadata khung và tương tác với một tài liệu con ngay cả khi iframe là chéo nguồn. Quyền truy cập cấp trình duyệt đó khác với JavaScript chạy bên trong trang cha, điều này bị giới hạn bởi chính sách cùng nguồn.

Scrapeless Scraping Browser di chuyển Chromium vào một môi trường chống phát hiện được lưu trữ trong khi giữ lại các API khung của Playwright. Kết nối sử dụng connect_over_cdp; mỗi dòng trích xuất sau khi tạo trình duyệt vẫn ở tiêu chuẩn Playwright.

Yêu cầu

  • Python 3.10 hoặc cao hơn.
  • playwright 1.59.0 hoặc phiên bản tương thích hiện tại.
  • Chrome/Chromium địa phương cho phương án thực thi hoàn chỉnh.
  • Một tài khoản Scrapeless được tài trợ và SCRAPELESS_API_KEY cho kết nối trình duyệt đám mây. Các phiên mới trên tài khoản xác minh trả về mã 14500, vì vậy kết nối đám mây là một khoảng trống yêu cầu đã được gán nhãn.

Cài đặt

bash Copy
python -m pip install "playwright==1.59.0"

Ví dụ có thể chạy sử dụng /usr/bin/google-chrome của máy chủ. Sử dụng Chromium do Playwright quản lý nếu đó là cách mà dự án của bạn cấp phát trình duyệt.

Kết nối với Scrapeless Scraping Browser

Lưu ý: Kết nối này cần số dư Scraping Browser được tài trợ. Tài khoản xác minh cuối cùng trả lại insufficient balance, please recharge first. Sử dụng khóa được tài trợ của riêng bạn; việc liệt kê khung và trích xuất bên dưới đã chạy hoàn toàn trên Chrome địa phương.

python Copy
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright

params = urlencode({
    "token": os.environ["SCRAPELESS_API_KEY"],
    "sessionTTL": 120,
    "proxyCountry": "US",
})
cdp_url = f"wss://browser.scrapeless.com/api/v2/browser?{params}"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(cdp_url)
    page = browser.contexts[0].pages[0]
    # Tiếp tục với các bước khung bên dưới.
    browser.close()

Sử dụng tài liệu phát triển Scrapeless cho các tham số kết nối hiện tại.

Bước 1 — Mở Một Trang Với Khung Con Đã Biết

Selenium duy trì một bộ thử nghiệm công khai nhỏ. Trang cha của nó có một iframe tên là iframe1-name, mà src tải formPage.html:

python Copy
TARGET_URL = "https://www.selenium.dev/selenium/web/iframes.html"

page.goto(TARGET_URL, wait_until="domcontentloaded")
page.wait_for_selector("#iframe1")
page.wait_for_timeout(500)
print("tiêu đề cha:", page.title())
print("email của cha khớp:", page.locator("#email").count())
text Copy
tiêu đề cha: Trang này có iframes
email của cha khớp: 0

Email đầu vào tồn tại, nhưng nó thuộc về tài liệu biểu mẫu nhúng hơn là tài liệu cha.

Bước 2 — Liệt kê Các Khung trước Khi Chọn Một Khung

page.frames chứa khung chính cộng với mọi khung con và hậu duệ được gắn kèm:

python Copy
print("số lượng khung:", len(page.frames))
for index, frame in enumerate(page.frames):
    print(index, repr(frame.name), frame.url, frame.title())
text Copy
số lượng khung: 2
0 '' https://www.selenium.dev/selenium/web/iframes.html Trang này có iframes
1 'iframe1-name' https://www.selenium.dev/selenium/web/formPage.html Chúng tôi rời khỏi đây

Chỉ số không là tài liệu chính. Đừng biến chỉ số một thành hợp đồng vĩnh viễn: một quảng cáo khác, widget đồng ý hoặc khung phân tích có thể thay đổi thứ tự. Tên và URL là bằng chứng tốt hơn.

Bước 3 — Chọn Khung theo Tên hoặc URL

Cấu trúc cung cấp cho bạn cả hai tín hiệu ổn định:

python Copy
named_frame = page.frame(name="iframe1-name")
url_frame = next(
    frame for frame in page.frames
    if frame.url.endswith("/formPage.html")
)

assert named_frame is url_frame
print("khung đã chọn:", url_frame.name)
print("tiêu đề đã chọn:", url_frame.title())

Nếu tên được tạo, hãy khớp với một mẫu URL giới hạn hoặc tìm phần tử iframe sở hữu và gọi content_frame(). Thất bại khi có nhiều ứng viên khớp; lựa chọn im lặng bản sao đầu tiên tạo ra dữ liệu khả thi từ widget sai.

Bước 4 — Trích Xuất Dữ Liệu Từ Tài Liệu Con

Khi bạn giữ khung Frame, API định vị của nó hoạt động giống như của trang:

python Copy
email = url_frame.locator("#email")
selected = url_frame.locator("#multi option:checked").evaluate_all(
    "options => options.map(option => option.value)"
)

record = {
    "frame_name": url_frame.name,
    "frame_url": url_frame.url,
    "frame_title": url_frame.title(),
    "email_inputs": email.count(),
    "selected_values": selected,
}

print("số lượng email đầu vào:", record["email_inputs"])
print("giá trị đã chọn:", record["selected_values"])
text Copy
số lượng email đầu vào: 1
giá trị đã chọn: ['trứng', 'xúc xích']

Trang con có một trường chọn nhiều với hai tùy chọn đó được chọn trong nguồn của nó. Đây là một kiểm tra mạnh hơn so với việc chỉ đọc một tiêu đề: nó chứng minh Playwright đã đến tài liệu biểu mẫu và đánh giá trạng thái bên trong nó.

Bước 5 — Sử Dụng FrameLocator cho Các Hành Động Trực Tiếp

Khi bạn không cần siêu dữ liệu của khung, FrameLocator ngắn hơn:

python Copy
frame_ui = page.frame_locator("#iframe1")
print("email qua FrameLocator:", frame_ui.locator("#email").count())

Hướng dẫn các khung chính thức của Playwright cho thấy cùng hai cấp độ: định vị nội dung thông qua một phần tử iframe, hoặc nhận được một đối tượng Frame theo URL/tên.

Sẵn sàng chạy những bộ định vị đó trong một trình duyệt được lưu trữ? Tạo một tài khoản Scrapeless miễn phí và chỉ thay thế việc tạo trình duyệt.

Kịch Bản Xác Minh Địa Phương Hoàn Chỉnh

python Copy
from playwright.sync_api import sync_playwright

TARGET_URL = "https://www.selenium.dev/selenium/web/iframes.html"

with sync_playwright() as p:
    browser = p.chromium.launch(
        executable_path="/usr/bin/google-chrome",
        headless=True,
    )
    page = browser.new_page()
    page.goto(TARGET_URL, wait_until="domcontentloaded")
    page.wait_for_selector("#iframe1")
    page.wait_for_timeout(500)

    child = next(
        frame for frame in page.frames
        if frame.url.endswith("/formPage.html")
    )
    selected = child.locator("#multi option:checked").evaluate_all(
        "options => options.map(option => option.value)"
    )
    frame_locator_count = page.frame_locator("#iframe1").locator("#email").count()

    assert page.locator("#email").count() == 0
    assert child.name == "iframe1-name"
    assert child.locator("#email").count() == 1
    assert selected == ["trứng", "xúc xích"]
    assert frame_locator_count == 1

    print("tiêu đề cha:", page.title())
    print("số lượng email cha khớp:", page.locator("#email").count())
    print("số lượng khung:", len(page.frames))
    print("tên con:", child.name)
    print("URL con:", child.url)
    print("tiêu đề con:", child.title())
    print("số lượng email con khớp:", child.locator("#email").count())
    print("giá trị đã chọn:", selected)
    print("số lượng khớp email FrameLocator:", frame_locator_count)
    browser.close()

Chạy hoàn chỉnh trả về hai khung, số lượng email cha khớp bằng không, một khung con khớp email, tên/tiêu đề/URL khung mong đợi, và ['trứng', 'xúc xích'] từ biểu mẫu con.

Những Gì Bạn Nhận Được

Quy trình làm việc đã được xác minh trả về cả trạng thái biểu mẫu đã trích xuất và đủ siêu dữ liệu khung để xác định nguồn gốc của nó:

json Copy
{
  "parent_email_matches": 0,
  "frame_count": 2,
  "frame_name": "iframe1-name",
  "frame_url": "https://www.selenium.dev/selenium/web/formPage.html",
  "frame_title": "Chúng tôi rời khỏi đây",
  "child_email_matches": 1,

"selected_values": ["trứng", "xúc xích"]
}

Copy
Kết quả đưa ra bốn sự thật: tài liệu cha không thể nhìn thấy trường email, đứa trẻ dự định có thể nhận diện bằng tên và URL, bộ định vị trẻ tìm thấy một đầu vào khớp, và các giá trị biểu mẫu được chọn đến từ bên trong khung đó. Giữ tên khung và URL với mỗi bản ghi được trích xuất khi một trang chứa nhiều tài liệu nhúng.

## Khung Iframe Chéo Nguồn và Chính Sách Giống Nguồn

JavaScript của trình duyệt như `document.querySelector("iframe").contentDocument` có thể bị chặn khi nguồn gốc của cha và trẻ khác nhau. Playwright giao tiếp với giao thức tự động hóa trình duyệt và tiết lộ trẻ như một Khung, vì vậy nó có thể xác định vị trí và tương tác với các yếu tố trong tài liệu chéo nguồn.

Điều đó không loại bỏ mọi ranh giới. Các thuộc tính hộp cát có thể hạn chế các tập lệnh, điều hướng có thể thay thế một khung trong khi bạn đang đọc nó, và các tiện ích mở rộng của trình duyệt hoặc trình xem PDF có thể không tiết lộ một tài liệu HTML thông thường. Kiểm tra cấu trúc khung thực tế trước khi viết hợp đồng trích xuất.

## Khung Động và Khung Lồng

### Chờ đợi đính kèm và điều hướng

Một phần tử iframe có thể xuất hiện trước khi đứa trẻ của nó đạt URL cuối cùng. Chờ một bộ định vị trẻ hoặc kiểm tra các sự kiện điều hướng khung; đánh dấu sẵn sàng hữu ích là phần tử chứa dữ liệu, không chỉ là thẻ `<iframe>` cha.

### Mong đợi sự tách rời

Các ứng dụng trang đơn đôi khi loại bỏ và tái tạo các iframe. Một đối tượng Khung đã lưu có thể trở nên tách rời. Giải quyết lại khung từ tên, URL hoặc phần tử chủ sở hữu ổn định của nó sau khi chuyển giao giao diện thay vì giả định rằng đối tượng cũ vẫn tồn tại.

### Đi qua các khung lồng một cách có chủ đích

Đối với các ngữ cảnh lồng nhau, kiểm tra `frame.child_frames` hoặc chuỗi FrameLocators. Giữ đường dẫn cha-con trong nguồn xuất của đầu ra để hai tiện ích widget cùng tên không thể bị nhầm lẫn.

## Kết luận

Việc trích xuất từ iframe bắt đầu bằng cách chọn tài liệu phù hợp. Liệt kê cấu trúc khung, chọn trẻ bằng tên hoặc URL ổn định, chờ một phần tử bên trong nó, và giữ thông tin siêu dữ liệu khung với bản ghi được trích xuất. Sử dụng FrameLocator cho các hành động ngắn gọn và đối tượng Khung khi bạn cần danh tính, điều hướng hoặc kiểm soát khung lồng. Chuyển quy trình làm việc sang Scrapeless thay đổi cách tạo trình duyệt, không phải logic khung.

## Sẵn sàng Trích Xuất Dữ Liệu Từ Iframes?

Tham gia các nhà phát triển xây dựng quy trình trích xuất dựa trên trình duyệt trong cộng đồng Scrapeless: [Discord](https://discord.gg/VU2vtbq7Q2) · [Telegram](https://t.me/scrapeless).

[Bắt đầu với Scrapeless](https://app.scrapeless.com/passport/login/?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=iframe-web-scraping-scraping-browser), xem lại [giá của Scrapeless](https://www.scrapeless.com/vi/pricing?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=iframe-web-scraping-scraping-browser), và đọc [những gì CDP tiết lộ](https://www.scrapeless.com/vi/blog/what-is-chrome-devtools-protocol?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=iframe-web-scraping-scraping-browser) trước khi chuyển quy trình khung tương tự sang trình duyệt được lưu trữ.

## Câu Hỏi Thường Gặp

**Q: Tại sao trang cha không thể tìm thấy một phần tử bên trong một iframe?**

Iframe sở hữu một tài liệu riêng biệt. Các bộ định vị trang cha tìm kiếm trong ngữ cảnh duyệt cha; hãy chọn Khung trẻ hoặc sử dụng FrameLocator trước.

**Q: Tôi có nên chọn một khung theo chỉ số mảng không?**

Không. Thứ tự khung thay đổi khi các trang thêm tiện ích hoặc quảng cáo. Thích sử dụng một tên ổn định, mẫu URL, hoặc phần tử iframe sở hữu và thất bại với các khớp mơ hồ.

**Q: Sự khác biệt giữa Khung và FrameLocator là gì?**

Một Khung tiết lộ danh tính tài liệu, URL, tên, vòng đời và các khung con. FrameLocator cung cấp các thao tác định vị ngắn gọn thông qua một phần tử iframe cụ thể.

**Q: Playwright có thể truy cập một iframe chéo nguồn không?**

Có, Playwright có thể tự động hóa các khung trẻ chéo nguồn thông qua giao thức trình duyệt ngay cả khi JavaScript trong trang không thể đọc `contentDocument` do chính sách giống nguồn.

**Q: Làm thế nào để tôi chờ một iframe được tải động?**

Chờ một bộ định vị chứa dữ liệu bên trong khung hoặc một URL khung cuối cùng đã biết. Sự hiện diện của phần tử iframe đơn thuần không chứng minh tài liệu trẻ của nó đã hoàn tất điều hướng.

**Q: Điều gì xảy ra nếu khung bị tách rời?**

Khung đã lưu không còn đại diện cho một tài liệu sống. Giải quyết lại khung thay thế từ chứng cứ ổn định sau khi chuyển trang.

**Q: Trích xuất iframe có hợp pháp không?**

Việc nhúng không thay đổi quyền dữ liệu hoặc điều khoản của mục tiêu. Xem lại chính sách của trang và nhà cung cấp nhúng, tôn trọng <a href="https://datatracker.ietf.org/doc/html/rfc9309" rel="nofollow"><strong>chỉ thị robot</strong></a> khi có thể, giữ khối lượng trong giới hạn, và tìm kiếm tư vấn pháp lý cho việc thu thập nhạy cảm hoặc thương mại.

Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục