Bộ chọn python của nhà viết kịch

Playwright là một bộ công cụ tự động hóa trình duyệt phổ biến có thể được sử dụng trong web scraping để cạo nội dung web động hoặc ứng dụng web

Sử dụng Playwright, chúng tôi không cần phải thiết kế ngược và hiểu các công nghệ web phức tạp vì trình duyệt sẽ làm mọi thứ cho chúng tôi. Điều này làm cho Playwright trở thành một công cụ tuyệt vời để dễ dàng cạo dữ liệu mà không cần kiến ​​thức phát triển web nâng cao

Trong hướng dẫn thực tế chuyên sâu này, chúng ta sẽ xem cách cạo bằng Playwright và Python. Đối với điều đó, chúng tôi sẽ sử dụng một dự án cạo ví dụ bằng cách cạo co giật. TV

Chúng tôi sẽ đề cập đến các câu hỏi phổ biến như cách Playwright hoạt động và so sánh với các đối thủ cạnh tranh. Cách thực hiện các tác vụ phổ biến như điều hướng trình duyệt, nhấp vào nút, nhập văn bản và phân tích dữ liệu;

Quét các trang web động bằng trình duyệt web

Để biết thêm về cách sử dụng trình duyệt, hãy xem bài viết giới thiệu đầy đủ của chúng tôi so sánh các công cụ phổ biến như Selenium, Playwright và Puppeteer

Nhà viết kịch là gì?

Playwright là bộ công cụ tự động hóa trình duyệt web đa nền tảng và đa ngôn ngữ. Nó chủ yếu được sử dụng như một bộ thử nghiệm trang web nhưng nó hoàn toàn có khả năng tự động hóa trình duyệt nói chung và quét web

Sử dụng nhà viết kịch, chúng tôi có thể tự động hóa các trình duyệt web không đầu như Firefox hoặc Chrome để điều hướng trang web giống như con người. truy cập URL, nhấp vào nút, viết văn bản và thực thi javascript

Nhà viết kịch cho phép chúng tôi giao tiếp với trình duyệt web thông qua mã Python

Đây là một công cụ tuyệt vời để quét web vì nó cho phép quét các trang web động được hỗ trợ bằng javascript mà không cần phải đảo ngược hành vi của chúng. Nó cũng có thể giúp chặn vì trình quét đang chạy một trình duyệt hoàn chỉnh có vẻ giống con người hơn các yêu cầu HTTP độc lập

Nhà viết kịch vs Selenium vs Puppeteer

So với các bộ công cụ tự động hóa trình duyệt phổ biến khác như Selenium hay Puppeteer, Playwright có một vài lợi thế

  • Playwright hỗ trợ nhiều ngôn ngữ lập trình trong khi Puppeteer chỉ khả dụng trong Javascript
  • Playwright sử dụng Giao thức Chrome Devtools [CDP] và API hiện đại hơn, trong khi Selenium đang sử dụng giao thức webdriver và API kém hiện đại hơn
  • Playwright hỗ trợ cả ứng dụng khách không đồng bộ và đồng bộ, trong khi Selenium chỉ hỗ trợ ứng dụng khách đồng bộ và Puppeteer là ứng dụng khách không đồng bộ. Trong Playwright, chúng tôi có thể viết các trình dọn dẹp nhỏ bằng cách sử dụng máy khách đồng bộ và mở rộng quy mô đơn giản bằng cách chuyển sang kiến ​​trúc không đồng bộ phức tạp hơn

Nói cách khác, Playwright là một cải tiến ngang so với Selenium và Puppeteer. Tuy nhiên, mỗi bộ công cụ đều có thế mạnh riêng. Nếu bạn muốn tìm hiểu thêm, hãy xem các bài viết giới thiệu khác của chúng tôi

  • Quét web với Hướng dẫn Selenium và Python + Dự án mẫu
  • Quét web bằng trình duyệt không đầu. nghệ sĩ múa rối

Thành lập

Playwright cho Python có thể được cài đặt thông qua

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
5

# install playwright package:
$ pip install playwright
# install playwright chrome and firefox browsers
$ playwright install chrome firefox

Lệnh trên sẽ cài đặt gói playwright và trình duyệt playwright nhị phân. Để thu thập Playwright, tốt nhất nên sử dụng trình duyệt Chrome hoặc Firefox vì đây là những triển khai ổn định nhất và thường ít bị chặn nhất

Mẹo. Nhà viết kịch trong REPL

Cách dễ nhất để hiểu Playwright là thử nghiệm nó trong thời gian thực thông qua Python REPL [Đọc, Đánh giá, In, Lặp lại] như ipython

Bắt đầu từ

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
6, chúng tôi có thể khởi chạy trình duyệt viết kịch và thực hiện các lệnh tự động hóa trình duyệt trong thời gian thực để thử nghiệm và tạo nguyên mẫu cho trình quét web của chúng tôi

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]

Dưới đây là sơ lược về những gì chúng tôi sẽ làm trong bài viết này qua con mắt của REPL

0. 00

/

Nhà viết kịch thông qua iPython REPL

Bây giờ, chúng ta hãy xem xét điều này chi tiết hơn

Những thứ cơ bản

Để bắt đầu, chúng ta cần khởi chạy một trình duyệt và bắt đầu một tab trình duyệt mới

with sync_playwright[] as pw:
    # create browser instance
    browser = pw.chromium.launch[
        # we can choose either a Headful [With GUI] or Headless mode:
        headless=False,
    ]
    # create context
    # using context we can define page properties like viewport dimensions
    context = browser.new_context[
        # most common desktop viewport is 1920x1080
        viewport={"width": 1920, "height": 1080}
    ]
    # create page aka browser tab which we'll be using to do everything
    page = context.new_page[]

Khi chúng tôi đã sẵn sàng trang trình duyệt của mình, chúng tôi có thể bắt đầu tìm kiếm web của Playwright mà chúng tôi chỉ cần một số tính năng của Playwright

  • điều hướng [tôi. e. đi đến URL]
  • nhấp vào nút
  • nhập văn bản
  • Thực thi Javascript
  • Chờ tải nội dung

Hãy xem các tính năng này thông qua một ví dụ thực tế.
Đối với điều này, chúng tôi sẽ thu thập dữ liệu video từ https. //www. co giật. phần tv/art nơi người dùng truyền phát quá trình sáng tạo nghệ thuật của họ. Chúng tôi sẽ thu thập dữ liệu động như tên luồng, số lượng người xem và thông tin chi tiết về tác giả.

Nhiệm vụ của chúng ta trong Playwright cho bài tập này là

  1. Bắt đầu phiên bản trình duyệt, ngữ cảnh và tab trình duyệt [trang]
  2. Truy cập https. //www. co giật. tv/thư mục/trò chơi/Nghệ thuật
  3. Đợi trang tải đầy đủ
  4. Phân tích cú pháp dữ liệu trang đã tải cho tất cả các luồng đang hoạt động

Điều hướng và Chờ đợi

Để điều hướng, chúng ta có thể sử dụng chức năng

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
7 sẽ hướng trình duyệt đến bất kỳ URL nào

with sync_playwright[] as pw:
    browser = pw.chromium.launch[headless=False]
    context = browser.new_context[viewport={"width": 1920, "height": 1080}]
    page = context.new_page[]

    # go to url
    page.goto["//twitch.tv/directory/game/Art"]
    # get HTML
    print[page.content[]]

Tuy nhiên, đối với các trang web sử dụng nhiều javascript như twitch. tv, mã

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
8 của chúng tôi có thể trả về dữ liệu sớm trước khi mọi thứ được tải.
Để đảm bảo điều đó không xảy ra, chúng tôi có thể đợi một phần tử cụ thể xuất hiện trên trang. Nói cách khác, nếu danh sách video có trên trang thì chúng ta có thể giả định rằng trang đã được tải một cách an toàn.

________số 8

Ở trên, chúng tôi đã sử dụng chức năng

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
9 để đợi một phần tử được xác định bởi bộ chọn CSS của chúng tôi xuất hiện trên trang

Phân tích dữ liệu

Vì Playwright sử dụng trình duyệt web thực với môi trường javascript nên chúng tôi có thể sử dụng khả năng phân tích cú pháp HTML của trình duyệt. Trong Playwright, điều này được thực hiện thông qua tính năng

with sync_playwright[] as pw:
    # create browser instance
    browser = pw.chromium.launch[
        # we can choose either a Headful [With GUI] or Headless mode:
        headless=False,
    ]
    # create context
    # using context we can define page properties like viewport dimensions
    context = browser.new_context[
        # most common desktop viewport is 1920x1080
        viewport={"width": 1920, "height": 1080}
    ]
    # create page aka browser tab which we'll be using to do everything
    page = context.new_page[]
0

# install playwright package:
$ pip install playwright
# install playwright chrome and firefox browsers
$ playwright install chrome firefox
1Đầu ra ví dụ
# install playwright package:
$ pip install playwright
# install playwright chrome and firefox browsers
$ playwright install chrome firefox
2

Trong đoạn mã trên, chúng tôi đã chọn từng hộp kết quả bằng bộ chọn XPath và trích xuất chi tiết từ bên trong hộp đó bằng bộ chọn CSS

Thật không may, khả năng phân tích cú pháp của các nhà viết kịch hơi rắc rối và có thể dễ dàng bị hỏng khi phân tích cú pháp các phần tử tùy chọn như trường

with sync_playwright[] as pw:
    # create browser instance
    browser = pw.chromium.launch[
        # we can choose either a Headful [With GUI] or Headless mode:
        headless=False,
    ]
    # create context
    # using context we can define page properties like viewport dimensions
    context = browser.new_context[
        # most common desktop viewport is 1920x1080
        viewport={"width": 1920, "height": 1080}
    ]
    # create page aka browser tab which we'll be using to do everything
    page = context.new_page[]
1 trong ví dụ của chúng tôi. Thay vào đó, chúng ta có thể sử dụng phân tích cú pháp Python truyền thống thông qua các gói parsel hoặc beautifulsoup hoạt động nhanh hơn nhiều và cung cấp API mạnh mẽ hơn

# install playwright package:
$ pip install playwright
# install playwright chrome and firefox browsers
$ playwright install chrome firefox
4

Mặc dù công cụ định vị nhà viết kịch không phù hợp để phân tích cú pháp nhưng chúng rất phù hợp để tương tác với trang web. Tiếp theo, chúng ta hãy xem cách chúng ta có thể nhấp vào các nút và nhập văn bản bằng bộ định vị

Nhấp vào nút và nhập văn bản

Để khám phá nhấp chuột và nhập văn bản, hãy mở rộng co giật của chúng tôi. cạp tv với chức năng tìm kiếm

  1. Chúng ta sẽ đi co giật. TV
  2. Chọn hộp tìm kiếm và nhập truy vấn tìm kiếm
  3. Nhấp vào nút tìm kiếm hoặc nhấn Enter
  4. Đợi nội dung tải
  5. phân tích kết quả

Trong nhà viết kịch để tương tác với các thành phần web, chúng tôi có thể sử dụng cùng chức năng

with sync_playwright[] as pw:
    # create browser instance
    browser = pw.chromium.launch[
        # we can choose either a Headful [With GUI] or Headless mode:
        headless=False,
    ]
    # create context
    # using context we can define page properties like viewport dimensions
    context = browser.new_context[
        # most common desktop viewport is 1920x1080
        viewport={"width": 1920, "height": 1080}
    ]
    # create page aka browser tab which we'll be using to do everything
    page = context.new_page[]
2 mà chúng tôi đã sử dụng trong phân tích cú pháp

# install playwright package:
$ pip install playwright
# install playwright chrome and firefox browsers
$ playwright install chrome firefox
6

Ghi chú. công cụ định vị của nhà viết kịch không cho phép bộ chọn dẫn đến nhiều giá trị. Nó sẽ không biết cái nào để nhấp vào. Có nghĩa là, bộ chọn của chúng tôi phải là duy nhất cho một yếu tố mà chúng tôi muốn tương tác với

Chúng tôi đã làm cho chức năng tìm kiếm hoạt động và trích xuất trang đầu tiên của kết quả, tuy nhiên, làm thế nào để chúng tôi có được các trang còn lại?

Cuộn và phân trang vô hạn

Phần kết quả stream của twitch. tv đang sử dụng phân trang cuộn vô hạn. Để truy xuất phần còn lại của kết quả trong trình quét Playwright của chúng tôi, chúng tôi cần liên tục cuộn đến kết quả cuối cùng hiển thị trên trang để kích hoạt tải trang mới

Chúng tôi có thể làm điều này bằng cách cuộn xuống cuối toàn bộ trang nhưng điều đó không phải lúc nào cũng hoạt động trong các trình duyệt không đầu. Cách tốt hơn là tìm tất cả các phần tử và cuộn phần tử cuối cùng vào chế độ xem một cách rõ ràng

Trong nhà viết kịch, điều này có thể được thực hiện bằng cách sử dụng bộ định vị và hàm

with sync_playwright[] as pw:
    # create browser instance
    browser = pw.chromium.launch[
        # we can choose either a Headful [With GUI] or Headless mode:
        headless=False,
    ]
    # create context
    # using context we can define page properties like viewport dimensions
    context = browser.new_context[
        # most common desktop viewport is 1920x1080
        viewport={"width": 1920, "height": 1080}
    ]
    # create page aka browser tab which we'll be using to do everything
    page = context.new_page[]
3. Chúng tôi sẽ tiếp tục cuộn kết quả cuối cùng vào chế độ xem để kích hoạt tải trang tiếp theo cho đến khi không còn kết quả mới nào xuất hiện

# install playwright package:
$ pip install playwright
# install playwright chrome and firefox browsers
$ playwright install chrome firefox
8

Trong mã ví dụ ở trên, chúng tôi sẽ liên tục kích hoạt tải kết quả mới cho đến khi đạt đến cuối phân trang. Trong trường hợp này, mã của chúng tôi sẽ tạo ra hàng trăm kết quả được phân tích cú pháp

Chức năng cao cấp

Chúng tôi đã đề cập đến các tính năng viết kịch phổ biến nhất được sử dụng trong quét web. điều hướng, chờ đợi, nhấp, nhập và cuộn. Tuy nhiên, có một vài tính năng nâng cao hữu ích cho việc cạo các mục tiêu quét web phức tạp hơn

Đánh giá Javascript

Nhà viết kịch có thể đánh giá bất kỳ mã javascript nào trong ngữ cảnh của trang hiện tại. Sử dụng javascript, chúng tôi có thể làm mọi thứ chúng tôi đã làm trước đây như điều hướng, nhấp và cuộn, v.v. Trên thực tế, nhiều chức năng viết kịch này được triển khai thông qua đánh giá javascript

Ví dụ: nếu chức năng cuộn tích hợp bị lỗi, chúng tôi có thể xác định chức năng javascript cuộn của riêng mình và gửi nó tới Playwright

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
0

Đoạn mã trên sẽ cuộn kết quả cuối cùng vào chế độ xem giống như trước đây nhưng nó sẽ cuộn trơn tru và đến tận cùng của đối tượng. Cách tiếp cận này có nhiều khả năng kích hoạt tải trang tiếp theo hơn so với chức năng

with sync_playwright[] as pw:
    # create browser instance
    browser = pw.chromium.launch[
        # we can choose either a Headful [With GUI] or Headless mode:
        headless=False,
    ]
    # create context
    # using context we can define page properties like viewport dimensions
    context = browser.new_context[
        # most common desktop viewport is 1920x1080
        viewport={"width": 1920, "height": 1080}
    ]
    # create page aka browser tab which we'll be using to do everything
    page = context.new_page[]
4 của Playwright

Đánh giá Javascript là một tính năng mạnh mẽ có thể được sử dụng để loại bỏ các ứng dụng web phức tạp vì nó cho phép chúng tôi kiểm soát hoàn toàn các khả năng của trình duyệt thông qua javascript

Chặn yêu cầu và phản hồi

Nhà viết kịch theo dõi tất cả các yêu cầu và phản hồi nền mà trình duyệt gửi và nhận. Trong quét web, chúng tôi có thể sử dụng điều này để sửa đổi các yêu cầu nền hoặc thu thập dữ liệu bí mật từ các phản hồi nền

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
1

Trong ví dụ trên, chúng tôi xác định các hàm chặn của mình và đính kèm chúng vào trang viết kịch của chúng tôi. Điều này sẽ cho phép chúng tôi kiểm tra và sửa đổi mọi yêu cầu nền và tiền cảnh mà trình duyệt đưa ra

Tài nguyên chặn

Quét web bằng trình duyệt không đầu thực sự tốn nhiều băng thông. Trình duyệt đang tải xuống tất cả hình ảnh, phông chữ và các tài nguyên đắt tiền khác mà trình quét web của chúng tôi không quan tâm. Để tối ưu hóa điều này, chúng tôi có thể định cấu hình phiên bản Playwright của mình để chặn các tài nguyên không cần thiết này

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
2

Trong ví dụ trên, chúng tôi đang xác định quy tắc chặn yêu cầu Playwright loại bỏ bất kỳ yêu cầu tài nguyên nền không mong muốn nào thuộc loại bị bỏ qua hoặc chứa các cụm từ bị bỏ qua trong URL [như google analytics]

Chúng ta có thể thấy lượng dữ liệu được lưu trong tab Mạng của Devtools

Với việc chặn, chúng tôi đã sử dụng lưu lượng truy cập ít hơn gần 4 lần

Tránh chặn

Mặc dù Playwright đang sử dụng trình duyệt thực nhưng vẫn có thể xác định xem trình duyệt đó được kiểm soát bởi người dùng thực hay được tự động hóa bởi bộ công cụ tự động hóa. Để biết thêm về điều này, hãy xem bài viết mở rộng của chúng tôi về lấy dấu vân tay javascript và rò rỉ biến

Javascript được sử dụng như thế nào để chặn Web Scraper?

Giới thiệu về dấu vân tay javascript và cách củng cố các trình duyệt web tự động chống lại nó

Giải pháp thay thế của ScrapFly

ScrapFly API cung cấp các khả năng tương tự như Playwright thông qua kết xuất javascript và các tính năng kịch bản javacript cho phép truy cập vào hàng nghìn trình duyệt web tùy chỉnh có thể hiển thị các trang hỗ trợ javascript mà không bị chặn

Sử dụng SDK ScrapFly, chúng tôi có thể sao chép các hành động giống như chúng tôi đã làm trong Playwright

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
3

Giống như với Playwright, chúng tôi có thể điều khiển trình duyệt web để điều hướng trang web, nhấp vào nút, nhập văn bản và trả lại HTML được hiển thị cuối cùng cho chúng tôi để phân tích cú pháp

Câu hỏi thường gặp

Để kết thúc phần giới thiệu này, chúng ta hãy xem một số câu hỏi thường gặp liên quan đến việc quét web với Playwright

Làm cách nào để sử dụng proxy với Playwright?

Chúng tôi có thể chỉ định địa chỉ IP proxy cho mỗi cơ sở trình duyệt của nhà viết kịch

$ pip install ipython nest_asyncio
$ ipython
import nest_asyncio; nest_asyncio.apply[]  # This is needed to use sync API in repl
from playwright.sync_api import sync_playwright
pw = sync_playwright.start[]
chrome = pw.chromium.launch[headless=False]
page = chrome.new_page[]
page.goto["//twitch.tv"]
4

Làm cách nào để tăng tốc Máy cạo Playwright?

Chúng tôi có thể tăng tốc đáng kể trình dọn dẹp bằng Playwright bằng cách đảm bảo rằng trình duyệt không đầu đang chặn hiển thị hình ảnh và phương tiện. Điều này có thể làm giảm đáng kể băng thông và tăng tốc độ cạo 2-5 lần. Để biết thêm, hãy xem phần Tài nguyên chặn

Trình duyệt không đầu nào tốt nhất để sử dụng cho Playwright Scraping?

Chrome không đầu hoạt động tốt nhất khi cạo bằng Playwright. Mặc dù vậy, Firefox thường có thể giúp tránh chặn và hình ảnh xác thực vì đây là trình duyệt ít phổ biến hơn. để biết thêm xem. Javascript được sử dụng như thế nào để chặn Web Scraper?

Bản tóm tắt

Trong phần giới thiệu chuyên sâu này, chúng tôi đã học cách sử dụng bộ công cụ tự động hóa trình duyệt web Playwright để quét web. Chúng tôi đã khám phá các tính năng cốt lõi như điều hướng, nhấp vào nút, nhập liệu và phân tích dữ liệu thông qua co giật trong đời thực. ví dụ cạp tv

Chúng tôi cũng đã xem xét các tính năng nâng cao hơn như chặn tài nguyên có thể giảm đáng kể mức sử dụng băng thông của trình quét web do trình duyệt của chúng tôi cung cấp. Tính năng tương tự cũng có thể được sử dụng để chặn các yêu cầu nền của trình duyệt để trích xuất các chi tiết như cookie hoặc sửa đổi kết nối

Chủ Đề