Trình duyệt truyền thống với giao diện đồ họa (GUI) thường tiêu tốn nhiều tài nguyên hệ thống khi tải trọng công việc tăng lên. Ngoài ra, nó yêu cầu một cửa sổ hiển thị để hiển thị các trang web, điều này làm chậm quá trình thử nghiệm và hạn chế khả năng mở rộng.
Headlesschrome là công cụ có thể xử lý nội dung động mà không cần trình duyệt thực.
Nó giải quyết vấn đề thử nghiệm tốn tài nguyên, cho phép thử nghiệm hiệu quả hơn và cải thiện khả năng mở rộng.
Làm thế nào để chạy trình duyệt headless trong Python và Selenium?
Hãy bắt đầu đọc bài viết này ngay bây giờ!
Trình duyệt của chúng ta là một chương trình máy tính cho phép người dùng truy cập và tương tác với các trang web. Ngược lại, trình duyệt headless không có giao diện đồ họa. Vậy nó có thể làm gì? Nó có khác biệt nhiều không? Đúng vậy! Các tính năng này giúp Python headlesschrome:
Chờ đã, bạn có thể thắc mắc làm thế nào chúng ta có thể tương tác với Headlesschrome vì nó không có GUI!
Đừng lo lắng. Hãy để tôi giới thiệu cho bạn về Web Driver.
Thêm một câu hỏi nữa là nó là gì? Web Driver là một framework. Nó cho phép chúng ta điều khiển các trình duyệt web khác nhau thông qua lập trình.
Có ví dụ nào điển hình không? Đúng vậy, chúng ta đều quen thuộc với Selenium. Chúng ta thường sử dụng nó, nhưng bạn có biết rằng nó cũng là một trình duyệt headless quan trọng không?
Nstbrowser có thể mô phỏng hành vi con người cao để vượt qua bảo vệ chống bot và mở khóa trang web! Hãy thử miễn phí ngay bây giờ!
Bạn có suy nghĩ hoặc câu hỏi nào về việc thu thập dữ liệu web và Browseless không?
Hãy đến xem những gì các nhà phát triển khác đang chia sẻ trên Discord và Telegram!
Selenium mạnh mẽ đến mức nào! Nó hỗ trợ bao nhiêu trình duyệt headless? Hãy nêu ra 6 trình duyệt ngay bây giờ! Chúng được điều khiển và thao tác chủ yếu thông qua WebDriver.
Python Selenium headlesschrome không phải là trình duyệt headless duy nhất!
Hãy xem xét các lựa chọn thay thế khác. Một số cung cấp chỉ một ngôn ngữ lập trình, trong khi số khác có thể cung cấp API cho nhiều ngôn ngữ.
Puppeteer là một thư viện Node.js được phát triển bởi Google. Nó cung cấp API cấp cao để điều khiển trình duyệt Chrome hoặc Chromium headless. Puppeteer cung cấp các tính năng mạnh mẽ để tự động hóa các tác vụ của trình duyệt, tạo ảnh chụp màn hình và PDF, cũng như thực hiện mã JavaScript trên các trang web.
Playwright là một công cụ khác để tự động hóa trang web, được phát triển bởi các thành viên của Microsoft. Về cơ bản, nó cũng là một thư viện Node.js để tự động hóa trình duyệt, nhưng nó cung cấp API cho các ngôn ngữ khác, chẳng hạn như Python, .NET và Java. Nó tương đối nhanh hơn so với Python Selenium.
Nstbrowser là trình duyệt chống phát hiện hoàn toàn miễn phí. Nó cho phép thực hiện web scraping ở chế độ headless, hoàn toàn giải phóng khỏi các hạn chế tài nguyên cục bộ. Dễ dàng thực hiện web scraping và tự động hóa quy trình.
Dưới đây là cách sử dụng Nstbrowserless, sử dụng trình duyệt chống phát hiện Nstbrowser trong container docker và cấu hình chế độ headless để scraping dữ liệu web, cụ thể là scraping ảnh đại diện của người dùng trên trang chủ Explore page TikTok:
Bước 1. Phân tích trang
Sau đó, bạn sẽ phát hiện rằng phần tử này là phần tử a liên kết với thuộc tính data-e2e="nav-explore".

Sau khi nhấp vào phần tử Explore, chúng ta phát hiện rằng trên trang không có ảnh đại diện của người dùng, và chúng ta chỉ có thể lấy tên người dùng.
Tại sao lại như vậy?
Đó là vì chúng ta cần nhấp vào tên người dùng để chuyển đến trang chủ người dùng trước khi có thể lấy ảnh đại diện của người dùng.
Vì vậy, chúng ta cần truy cập trang chủ của mỗi người dùng, sau đó tìm phần tử với thuộc tính data-e2e="explore-item-list", đó là danh sách người dùng động:

Bây giờ chúng ta cần hoàn thành phân tích bổ sung.
Trong phần tử div dưới danh sách, có phần tử với thuộc tính data-e2e="explore-card-desc" chứa thẻ a với thuộc tính data-e2e="explore-card-user-link".
Giá trị của thuộc tính href của thẻ a là ID người dùng. Thêm tên miền của TikTok vào trước sẽ dẫn đến trang chủ người dùng.
Chúng ta chuyển đến trang chủ người dùng và
có thể dễ dàng tìm thấy ảnh đại diện người dùng với thuộc tính div[data-e2e="user-page"] div[data-e2e="user-avatar"] span img trong src.
Bước 2. Tải xuống Docker container
docker pull nstbrowser/browserless:0.0.1-betaBước 3. Chạy Nstbrowserless container:
docker run -it -e TOKEN=xxx -e SERVER_PORT=8848 -p 8848:8848 --name nstbrowserless nstbrowser/browserless:0.0.1-betaBước 4. Cấu hình trình duyệt headless (Python-Playwright):
import json
from urllib.parse import urlencode
from playwright.async_api import async_playwright
async def main():
    async with async_playwright() as playwright:
        config = {
            "once": True,
            "headless": True,  # thiết lập chế độ headless
            "autoClose": True,
            "args": {"--disable-gpu": "", "--no-sandbox": ""},  # Các tham số của trình duyệt cần là một từ điển
            "fingerprint": {
                "name": 'tiktok_scraper',
                "platform": 'windows',  # Hỗ trợ: windows, mac, linux
                "kernel": 'chromium',  # Hỗ trợ chỉ: chromium
                "kernelMilestone": '120',
                "hardwareConcurrency": 8,  # Hỗ trợ: 2, 4, 8, 10, 12, 14, 16
                "deviceMemory": 8,  # Hỗ trợ: 2, 4, 8
            },
        }
        query = {'config': json.dumps(config)}
        profileUrl = f"ws://127.0.0.1:8848/ws/connect?{urlencode(query)}"
        print("URL hồ sơ: ", profileUrl)
        browser = await playwright.chromium.connect_over_cdp(endpoint_url=profileUrl)
        try:
            page = await browser.new_page()
            await page.goto("chrome://version")
            await page.wait_for_load_state('networkidle')
            await page.screenshot(path="chrome_version.png")
        finally:
            await browser.close()
if __name__ == "__main__":
    import asyncio
    asyncio.run(main())Chạy mã trên, bạn sẽ nhận được thông tin trên trang chrome://version:

Tham số --headless trong dòng lệnh khởi động nhân chỉ định rằng nhân chạy trong chế độ headless.
Mã để scraping dữ liệu:
import json
from urllib.parse import urlencode
from playwright.async_api import async_playwright
async def scrape_user_profile(browser, user_home_page):
    # truy cập trang chủ của người dùng và scraping ảnh đại diện của người dùng
    user_page = await browser.new_page()
    try:
        await user_page.goto(user_home_page)
        await user_page.wait_for_load_state('networkidle')
        user_avatar_element = await user_page.query_selector(
            'div[data-e2e="user-page"] div[data-e2e="user-avatar"] span img')
        if user_avatar_element:
            user_avatar = await user_avatar_element.get_attribute('src')
            if user_avatar:
                print(user_avatar)
                # TODO
    finally:
        await user_page.close()
async def main():
    async with async_playwright() as playwright:
        config = {
            "once": True,
            "headless": True,  # hỗ trợ: true hoặc false
            "autoClose": True,
            "args": {"--disable-gpu": "", "--no-sandbox": ""},  # Các tham số của trình duyệt cần là một từ điển
            "fingerprint": {
                "name": 'tiktok_scraper',
                "platform": 'windows',  # Hỗ trợ: windows, mac, linux
                "kernel": 'chromium',  # Hỗ trợ chỉ: chromium
                "kernelMilestone": '120',
                "hardwareConcurrency": 8,  # Hỗ trợ: 2, 4, 8, 10, 12, 14, 16
                "deviceMemory": 8,  # Hỗ trợ: 2, 4, 8
            },
            "proxy": "",  # thiết lập proxy phù hợp nếu bạn không thể truy cập trang web TikTok
        }
        query = {
            'config': json.dumps(config)
        }
        profile_url = f"ws://127.0.0.1:8848/ws/connect?{urlencode(query)}"
        browser = await playwright.chromium.connect_over_cdp(endpoint_url=profile_url)
        tiktok_url = "https://www.tiktok.com"
        try:
            page = await browser.new_page()
            await page.goto(tiktok_url)
            await page.wait_for_load_state('networkidle')
            explore_elem = await page.query_selector('[data-e2e="nav-explore"]')
            if explore_elem:
                await explore_elem.click()
                ul_element = await page.query_selector('[data-e2e="explore-item-list"]')
                if ul_element:
                    li_elements = await ul_element.query_selector_all('div')
                    tasks = []
                    for li in li_elements:
                        # tìm URL liên kết trang chủ người dùng
                        a_element = await li.query_selector('[data-e2e="explore-card-desc"]')
                        if a_element:
                            user_link = await li.query_selector('a[data-e2e="explore-card-user-link"]')
                            if user_link:
                                href = await user_link.get_attribute('href')
                                if href:
                                    tasks.append(scrape_user_profile(browser, tiktok_url + href))
                    await asyncio.gather(*tasks)
        finally:
            await browser.close()
if __name__ == "__main__":
    import asyncio
    asyncio.run(main())Chạy chương trình:

Như vậy, chúng ta đã hoàn thành việc scraping dữ liệu ảnh đại diện của người dùng trên trang Explore của TikTok home page bằng cách sử dụng Python-Playwright qua Nstbrowserless.
Các trình duyệt headless sở hữu các tính năng mạnh mẽ và phương pháp sử dụng tiện lợi. Chúng có thể dễ dàng và nhanh chóng thực hiện việc scraping dữ liệu web và tự động hóa quy trình.
Trong bài viết này, chúng ta đã tìm hiểu:
Bắt đầu sử dụng Nstbrowser miễn phí ngay bây giờ để thực hiện tất cả các nhiệm vụ của bạn!