Hướng dẫn which python module is best for web scraping dynamic pages? - mô-đun python nào là tốt nhất để tìm kiếm các trang động trên web?

Hướng dẫn which python module is best for web scraping dynamic pages? - mô-đun python nào là tốt nhất để tìm kiếm các trang động trên web?

Internet mở rộng các trang web nhanh và hiện đại khá thường sử dụng các cơ chế tải nội dung động để cung cấp trải nghiệm người dùng tốt nhất. Tuy nhiên, mặt khác, việc trích xuất dữ liệu từ các trang web đó trở nên khó khăn hơn, vì nó yêu cầu thực hiện JavaScript nội bộ trong bối cảnh trang trong khi cạo. Hãy xem xét một số kỹ thuật thông thường cho phép trích xuất dữ liệu từ các trang web động bằng Python.

Trang web năng động là gì?

Một trang web động là một loại trang web có thể cập nhật hoặc tải nội dung sau khi tải HTML ban đầu. Vì vậy, trình duyệt nhận HTML cơ bản với JS và sau đó tải nội dung bằng mã JavaScript nhận được. Cách tiếp cận như vậy cho phép tăng tốc độ tải trang và ngăn chặn tải lại cùng một bố cục mỗi lần bạn muốn mở một trang mới.

Thông thường, các trang web động sử dụng AJAX để tải nội dung một cách linh hoạt hoặc thậm chí toàn bộ trang web dựa trên công nghệ ứng dụng một trang (SPA).

Trái ngược với các trang web động, chúng tôi có thể quan sát các trang web tĩnh chứa tất cả các nội dung được yêu cầu trên tải trang.

Một ví dụ tuyệt vời về trang web tĩnh là example.com:

Hướng dẫn which python module is best for web scraping dynamic pages? - mô-đun python nào là tốt nhất để tìm kiếm các trang động trên web?

Toàn bộ nội dung của trang web này được tải dưới dạng HTML đơn giản trong khi tải trang ban đầu.

Để chứng minh ý tưởng cơ bản của một trang web động, chúng ta có thể tạo một trang web chứa văn bản được hiển thị động. Nó sẽ không bao gồm bất kỳ yêu cầu nào để nhận thông tin, chỉ là kết xuất của một HTML khác sau khi tải trang:

<html>
<head>
<title>Dynamic Web Page Exampletitle>
<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
script>
head>
<body>
<div id="test">Web Scraping is harddiv>
body>
html>

Tất cả những gì chúng ta có ở đây là một tệp HTML có một ____10 trong phần thân chứa văn bản -

<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
1, nhưng sau khi tải trang, văn bản đó được thay thế bằng văn bản được tạo bởi JavaScript:

<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>

Để chứng minh điều này, hãy mở trang này trong trình duyệt và quan sát một văn bản được thay thế động:

Hướng dẫn which python module is best for web scraping dynamic pages? - mô-đun python nào là tốt nhất để tìm kiếm các trang động trên web?

Được rồi, vì vậy trình duyệt hiển thị một văn bản và thẻ HTML bao bọc văn bản này. Chúng ta không thể sử dụng đẹp hoặc lxml để phân tích nó? Hãy cùng tìm hiểu.
Can't we use BeautifulSoup or LXML to parse it? Let's find out.

Đẹp là một trong những thư viện Python phổ biến nhất trên internet để phân tích cú pháp HTML. Gần 80% hướng dẫn Python Scraping Web sử dụng thư viện này để trích xuất nội dung cần thiết từ HTML.

Hãy sử dụng BeautifulSoup để trích xuất văn bản bên trong

<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
0 từ mẫu của chúng tôi ở trên.

from bs4 import BeautifulSoup
import os


test_file = open(os.getcwd() + "/test.html")
soup = BeautifulSoup(test_file)
print(soup.find(id="test").get_text())

Đoạn mã này sử dụng thư viện

<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
3 để mở tệp HTML thử nghiệm của chúng tôi (
<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
4) từ thư mục cục bộ và tạo một thể hiện của thư viện đẹp được lưu trữ trong biến
<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
5. Sử dụng
<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
5, chúng tôi tìm thấy thẻ có ID
<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
7 và trích xuất văn bản từ nó.

Trong ảnh chụp màn hình từ phần bài viết đầu tiên, chúng tôi đã thấy rằng nội dung của trang thử nghiệm là

<script>
window.addEventListener("DOMContentLoaded", function() {
document.getElementById("test").innerHTML = "I ❤️ ScrapingAnt"
}, false);
</script>
8, nhưng đầu ra đoạn mã là như sau:

Và kết quả khác với kỳ vọng của chúng tôi (ngoại trừ bạn đã tìm ra những gì đang diễn ra ở đó). Mọi thứ đều chính xác từ góc độ đẹp - nó đã phân tích dữ liệu từ tệp HTML được cung cấp, nhưng chúng tôi muốn có kết quả tương tự như trình duyệt hiển thị. Lý do là trong JavaScript động không được thực thi trong quá trình phân tích cú pháp HTML.

Chúng ta cần HTML để chạy trong trình duyệt để xem các giá trị chính xác và sau đó có thể nắm bắt các giá trị đó theo chương trình.

Dưới đây bạn có thể tìm thấy bốn cách khác nhau để thực hiện JavaScript của trang web động và cung cấp dữ liệu hợp lệ cho trình phân tích cú pháp HTML: selenium, pyppeteer, nhà viết kịch và API quét web.Selenium, Pyppeteer, Playwright, and Web Scraping API.

SelenUim: Web cào bằng webdriver

Selenium là một trong những công cụ tự động hóa trình duyệt web phổ biến nhất cho Python. Nó cho phép liên lạc với các trình duyệt web khác nhau bằng cách sử dụng trình kết nối đặc biệt - một webDriver.

Để sử dụng selenium với Chrome/Chromium, chúng tôi sẽ cần tải xuống WebDriver từ kho lưu trữ và đặt nó vào thư mục dự án. Đừng quên tự cài đặt selen bằng cách thực thi:

Selenium khởi tạo và dòng chảy như sau:

  • Xác định và thiết lập biến đường dẫn Chrome
  • Xác định và thiết lập biến đường dẫn Chrome WebDriver
  • Xác định các đối số khởi chạy trình duyệt (để sử dụng chế độ không đầu, proxy, v.v.)
  • khởi tạo một webdriver với các tùy chọn được xác định ở trên
  • Tải trang web qua webdriver khởi tạo

Trong quan điểm mã, nó trông như sau:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import os


# Instantiate options
opts = Options()
# opts.add_argument(" — headless") # Uncomment if the headless version needed
opts.binary_location = ""

# Set the location of the webdriver
chrome_driver = os.getcwd() + ""

# Instantiate a webdriver
driver = webdriver.Chrome(options=opts, executable_path=chrome_driver)

# Load the HTML page
driver.get(os.getcwd() + "/test.html")

# Parse processed webpage with BeautifulSoup
soup = BeautifulSoup(driver.page_source)
print(soup.find(id="test").get_text())

Và cuối cùng, chúng tôi sẽ nhận được kết quả cần thiết:

Việc sử dụng Selenium cho trang web động cạo bằng Python không phức tạp và cho phép bạn chọn một trình duyệt cụ thể với phiên bản của nó nhưng bao gồm một số thành phần di chuyển cần được duy trì. Bản thân mã chứa một số bộ phận nồi hơi như thiết lập trình duyệt, webDriver, v.v.

Tôi thích sử dụng selen cho dự án cạo web của mình, nhưng bạn có thể tìm ra những cách dễ dàng hơn để trích xuất dữ liệu từ các trang web động bên dưới.

Pyppeteer: Python không đầu Chrome

Pyppeteer là một cổng Python không chính thức của Puppeteer JavaScript (không đầu) Thư viện tự động hóa trình duyệt Chrome/Chromium. Nó có khả năng chủ yếu làm giống như Puppeteer có thể, nhưng sử dụng python thay vì nodejs.

Puppeteer là một API cấp cao để kiểm soát Chrome không đầu, vì vậy nó cho phép bạn tự động hóa các hành động bạn đang thực hiện thủ công với trình duyệt: Copy Page Text, Tải xuống hình ảnh, lưu trang dưới dạng HTML, PDF, v.v.

Để cài đặt pyppeteer, bạn có thể thực thi lệnh sau:

Việc sử dụng pyppeteer cho nhu cầu của chúng tôi đơn giản hơn nhiều so với selenium:

import asyncio
from bs4 import BeautifulSoup
from pyppeteer import launch
import os


async def main():
# Launch the browser
browser = await launch()

# Open a new browser page
page = await browser.newPage()

# Create a URI for our test file
page_path = "file://" + os.getcwd() + "/test.html"

# Open our test file in the opened page
await page.goto(page_path)
page_content = await page.content()

# Process extracted content with BeautifulSoup
soup = BeautifulSoup(page_content)
print(soup.find(id="test").get_text())

# Close browser
await browser.close()


asyncio.get_event_loop().run_until_complete(main())

Tôi đã cố gắng bình luận về mọi phần nguyên tử của mã để hiểu rõ hơn. Tuy nhiên, nói chung, chúng tôi vừa mở một trang trình duyệt, tải một tệp HTML cục bộ vào đó và trích xuất HTML được hiển thị cuối cùng để xử lý đẹp hơn nữa.

Như chúng ta có thể mong đợi, kết quả là như sau:

Chúng tôi đã làm điều đó một lần nữa và không lo lắng về việc tìm kiếm, tải xuống và kết nối WebDriver với trình duyệt. Mặc dù, Pyppeteer trông bị bỏ rơi và không được duy trì đúng cách. Tình huống này có thể thay đổi trong tương lai gần nhất, nhưng tôi khuyên bạn nên nhìn vào thư viện mạnh mẽ hơn.

Nhà viết kịch: Tự động hóa trình duyệt Chromium, Firefox và WebKit

Nhà viết kịch có thể được coi là một nghệ sĩ múa rối mở rộng, vì nó cho phép sử dụng nhiều loại trình duyệt hơn (Chromium, Firefox và WebKit) để tự động hóa thử nghiệm và cạo ứng dụng web hiện đại. Bạn có thể sử dụng API Playwright trong JavaScript & TypeScript, Python, C# và, Java. Và thật tuyệt vời, vì các nhà bảo trì nhà viết kịch ban đầu hỗ trợ Python.

API gần giống như đối với pyppeteer, nhưng có phiên bản đồng bộ và async cả hai.

Cài đặt rất đơn giản như mọi khi:

pip install playwright
playwright install

Hãy viết lại ví dụ trước bằng cách sử dụng nhà viết kịch.

from bs4 import BeautifulSoup
from playwright.sync_api import sync_playwright
import os

# Use sync version of Playwright
with sync_playwright() as p:
# Launch the browser
browser = p.chromium.launch()

# Open a new browser page
page = browser.new_page()

# Create a URI for our test file
page_path = "file://" + os.getcwd() + "/test.html"

# Open our test file in the opened page
page.goto(page_path)
page_content = page.content()

# Process extracted content with BeautifulSoup
soup = BeautifulSoup(page_content)
print(soup.find(id="test").get_text())

# Close browser
browser.close()

Như một truyền thống tốt, chúng ta có thể quan sát sản lượng yêu quý của mình:

Chúng tôi đã trải qua một số phương pháp trích xuất dữ liệu khác nhau với Python, nhưng có cách nào đơn giản hơn để thực hiện công việc này không? Làm thế nào chúng ta có thể mở rộng quy mô giải pháp của mình và cạo dữ liệu với một số luồng?

Gặp API quét web!

API quét web

API quét web cào cung cấp khả năng cạo các trang web động chỉ với một cuộc gọi API duy nhất. Nó đã xử lý các proxy không đầu không đầu và các proxy, vì vậy phản hồi được cung cấp sẽ bao gồm nội dung được hiển thị JavaScript. Thăm dò ý kiến ​​proxy của người quét ngăn chặn việc chặn và cung cấp tỷ lệ thành công chiết xuất dữ liệu cao và không đổi.

Việc sử dụng API quét web là tùy chọn đơn giản nhất và chỉ yêu cầu các kỹ năng lập trình cơ bản.

Bạn không cần phải duy trì trình duyệt, thư viện, proxy, webDRIVERS hoặc mọi khía cạnh khác của máy quét web và tập trung vào phần thú vị nhất của phân tích dữ liệu - công việc.

Khi API quét web chạy trên các máy chủ đám mây, chúng tôi phải phục vụ tệp của mình ở đâu đó để kiểm tra nó. Tôi đã tạo một kho lưu trữ với một tệp duy nhất: https://github.com/kami4ka/dynamic-website-example/blob/main/index.html

URL thử nghiệm cuối cùng để quét dữ liệu web động có giao diện sau: https://kami4ka.github.io/dynamic-website- example/

Bản thân mã cạo là đơn giản nhất trên cả bốn thư viện được mô tả. Chúng tôi sẽ sử dụng thư viện ScrapingantClient để truy cập API quét web.

Hãy cài đặt đầu tiên:

pip install scrapingant-client

Và sử dụng thư viện đã cài đặt:

from bs4 import BeautifulSoup
from scrapingant_client import ScrapingAntClient

# Define URL with a dynamic web content
url = "https://kami4ka.github.io/dynamic-website-example/"

# Create a ScrapingAntClient instance
client = ScrapingAntClient(token='')

# Get the HTML page rendered content
page_content = client.general_request(url).content

# Parse content with BeautifulSoup
soup = BeautifulSoup(page_content)
print(soup.find(id="test").get_text())

Và kết quả vẫn là một cần thiết.

Tất cả các phép thuật trình duyệt không đầu xảy ra trên đám mây, vì vậy bạn cần thực hiện cuộc gọi API để có được kết quả.

Kiểm tra tài liệu để biết thêm thông tin về API Scrapingant.

Tóm tắt

Hôm nay chúng tôi đã kiểm tra bốn công cụ miễn phí cho phép cạo các trang web động bằng Python. Tất cả các thư viện này sử dụng trình duyệt không đầu (hoặc API có trình duyệt không đầu) dưới mui xe để hiển thị chính xác JavaScript bên trong trang HTML. Dưới đây bạn có thể tìm thấy các liên kết để tìm hiểu thêm thông tin về các công cụ đó và chọn cái đẹp nhất:

  • Top 5 thư viện Python phổ biến để quét web vào năm 2022
  • Tự động hóa trình duyệt web với Python và nhà viết kịch
  • Tài liệu selen
  • Tài liệu Pyppeteer
  • Tài liệu nhà viết kịch
  • Tài liệu cào

Happy Web Scraping và đừng quên sử dụng proxy để tránh chặn 🚀

Làm thế nào để bạn cạo một trang web động trong Python?

SelenUim: Web cào bằng webdriver..
Xác định và thiết lập biến đường dẫn Chrome ..
Xác định và thiết lập biến đường dẫn Chrome WebDriver ..
Xác định các đối số khởi chạy trình duyệt (để sử dụng chế độ không đầu, proxy, v.v.).
khởi tạo một webdriver với các tùy chọn được xác định ở trên ..
Tải một trang web qua WebDriver khởi tạo ..

Bạn có thể cạo nội dung động từ một trang web không?

Có hai cách tiếp cận để cạo một trang web động: Xóa nội dung trực tiếp từ JavaScript.Quét trang web khi chúng tôi xem nó trong trình duyệt của chúng tôi - sử dụng các gói Python có khả năng thực hiện JavaScript.Scrape the content directly from the JavaScript. Scrape the website as we view it in our browser — using Python packages capable of executing the JavaScript.

Đẹp có thể quét nội dung động?

Đó là lý tưởng là không thể vì BeautifulSoup chỉ là một trình phân tích cú pháp HTML.Vì vậy, trong các kịch bản đó, tốt hơn là sử dụng selenium để kéo nội dung động.Có nếu chúng ta không thể nhìn thấy các bảng trong thân HTML thì chúng được tạo động thông qua các tập lệnh. because BeautifulSoup is just an HTML parser. So in those scenarios it is better to use Selenium to pull dynamic content. Yes if we cant see tables in the HTML body then those are dynamically generated through scripts.

Python có thể được sử dụng để tạo các trang web động không?

Trong khóa học này, bạn sẽ tạo một ứng dụng Python trong đó bạn sẽ tạo một máy chủ HTTP đơn giản, tạo một trang web tĩnh, tạo các trang động bằng Python và truy cập các trang từ máy chủ bằng dòng lệnh cũng như từ trình duyệt.create dynamic pages using python, and access the pages from the server using the command line as well as from a browser.