🎯 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

MechanicalSoup: Tự động hóa việc thu thập dữ liệu từ biểu mẫu trong Python

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

29-Jun-2026

TL;DR:

  • MechanicalSoup tự động hóa các trang dựa trên biểu mẫu bằng cách kết hợp requests với BeautifulSoup. Một đối tượng StatefulBrowser mở một trang, chọn một biểu mẫu, điền các trường, gửi đi và phân tích phản hồi — không cần quy trình trình duyệt và không cần động cơ JavaScript.
  • Trình duyệt giữ các cookie và trạng thái phiên giữa các yêu cầu cho bạn. Sau khi đăng nhập hoặc một Set-Cookie, cùng một StatefulBrowser gửi cookie đã lưu lại trong mỗi yêu cầu sau đó, vì vậy các luồng nhiều bước hoạt động giống như một phiên thực.
  • select_form cộng với gán trường theo kiểu từ điển là toàn bộ giao diện API. Bạn nhắm đến một biểu mẫu bằng cách chọn CSS, đặt browser["fieldname"] = value, và gọi submit_selected() — thư viện xử lý mã hóa và chuyển hướng.
  • MechanicalSoup chỉ đọc HTML mà máy chủ trả về — nó không thực thi JavaScript. Một trang xây dựng nội dung ở phía client sẽ quay lại rỗng, vì không có bước render DOM giữa phản hồi HTTP và BeautifulSoup.
  • Khi một trang cần render hoặc gặp thách thức bot, hãy giao việc lấy dữ liệu cho Scrapeless Scraping Browser và tiếp tục phân tích với BeautifulSoup. SDK Scrapeless tạo ra một phiên đám mây, Playwright điều khiển nó qua CDP để chạy JavaScript, và HTML đã render chảy thẳng trở lại vào cùng một soup.select(...) selectors.
  • 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: các biểu mẫu vẫn là nơi nhiều công việc cạo dữ liệu ẩn giấu

Một phần lớn dữ liệu hữu ích nằm sau một biểu mẫu — một ô tìm kiếm, một đăng nhập, một bảng lọc, một wizard đa trang. MechanicalSoup tồn tại chính cho hình dạng trang đó. Nó bao bọc thư viện HTTP requests và BeautifulSoup thành một đối tượng trình duyệt có trạng thái duy nhất: nó lấy một trang, cho phép bạn điền và gửi các biểu mẫu HTML trên đó, theo dõi chuyển hướng, và phân tích bất cứ điều gì quay lại. Không có Selenium, không có Chromium, không có tệp nhị phân driver.

Sự tối giản giữ cho nó nhanh, và nó cũng vạch ra một ranh giới rõ ràng về những gì thư viện có thể đạt được. MechanicalSoup nói ngữ nghĩa HTTP và phân tích HTML. Nó không bao giờ chạy JavaScript của trang, vì vậy bất cứ điều gì được render ở phía client — một nguồn cấp dữ liệu cuộn vô hạn, một danh sách kết quả React, một ô tìm kiếm lấy kết quả qua XHR — sẽ quay lại dưới dạng vỏ rỗng mà máy chủ đã gửi lần đầu. Nó giữ nhanh trên một biểu mẫu được render tại máy chủ và hoàn toàn mù đối với một biểu mẫu được render tại client.

Hướng dẫn này đi qua một quy trình làm việc MechanicalSoup thực tế từ đầu đến cuối — cài đặt, mở một trang, điền và gửi một biểu mẫu, mang theo cookie qua một phiên, và cạo kết quả — sau đó cho thấy giới hạn trung thực. Khi một mục được render trong trình duyệt hoặc nằm sau một thách thức chống bot hoạt động, việc lấy dữ liệu sẽ chuyển sang Scrapeless Scraping Browser qua Chrome DevTools Protocol, trong khi mã phân tích BeautifulSoup của bạn vẫn giữ nguyên.


Những gì bạn có thể làm với nó

  • Gửi biểu mẫu đăng nhập và giữ xác thực. Điền vào các trường tên người dùng và mật khẩu, gửi đi, và StatefulBrowser sẽ giữ các cookie phiên cho mọi trang sau đó.
  • Lái các biểu mẫu tìm kiếm và lọc. Đặt trường truy vấn, gửi đi, và phân tích các hàng kết quả mà máy chủ trả về — vòng lặp tìm kiếm và cạo cổ điển.
  • Đi qua các luồng đa trang. Theo dõi các liên kết và gửi các biểu mẫu liên tiếp trong một đối tượng trình duyệt, với lọc cookie và tham chiếu được mang tự động.
  • Đọc các bảng và danh sách được máy chủ render. Bất cứ thứ gì có trong HTML thô — bảng giá cả, danh sách, trang thư mục — chỉ cách một soup.select().
  • Lập trình các lần gửi lặp lại. Chạy lại cùng một biểu mẫu với các giá trị trường khác nhau để quét một danh mục các truy vấn mà không cần chạm vào một trình duyệt thực.

Tại sao lại là Scrapeless Scraping Browser

Scrapeless Scraping Browser là một trình duyệt đám mây tùy chỉnh, chống phát hiện được thiết kế cho các crawler web và tác nhân AI. Đối với các trang mà MechanicalSoup không thể tiếp cận một mình, nó mang lại:

  • Render JavaScript ở phía đám mây — các script của trang chạy trên trình duyệt từ xa, vì vậy nội dung được tạo ở phía client tồn tại trong HTML vào thời điểm bạn phân tích nó.
  • Proxy dân cư tại 195+ quốc gia — cố định ra khỏi proxy_country để các trang geo-gated và các biểu mẫu bị khóa khu vực phục vụ nội dung mà chúng sẽ cho một khách truy cập địa phương.
  • Đánh dấu chống phát hiện — phiên trình bày như một trình duyệt thực, vì vậy các biểu mẫu hoặc trang kết quả được render thay vì trả về một thách thức mở vào giữa.
  • Duy trì phiên — cookie và trạng thái xác thực vẫn ấm áp qua các điều hướng trong một phiên, tính chất giống như MechanicalSoup cung cấp cho bạn ở địa phương.
  • Một điểm cuối CDP tiêu chuẩnbrowser_ws_endpoint là một URL WebSocket thông thường, vì vậy Playwright (hoặc bất kỳ khách hàng CDP nào) sẽ kết nối với một cuộc gọi duy nhất và mã phân tích của bạn vẫn giữ nguyên.

Lấy khóa API của bạn trong gói miễn phí tại app.scrapeless.com.


Điều kiện tiên quyết

  • Python 3.10 hoặc mới hơn
  • Một tài khoản Scrapeless và khóa API — đăng ký tại app.scrapeless.com (chỉ cần cho phần trình duyệt đám mây)
  • Kiến thức cơ bản về các bộ chọn CSS và terminal

Cài đặt

MechanicalSoup là một gói đơn lẻ kéo theo requestsbeautifulsoup4 làm các phụ thuộc:

bash Copy
pip install mechanicalsoup

Xác nhận việc cài đặt và phiên bản:

bash Copy
python -c "import mechanicalsoup; print(mechanicalsoup.__version__)"
# 1.4.0

Cấu hình: mở một trang với StatefulBrowser

Mọi thứ trong MechanicalSoup đều thông qua một StatefulBrowser. Nó giữ trang hiện tại, phiên làm việc và jar cookie. Đặt một tác nhân người dùng khi khởi tạo để các yêu cầu mang một danh tính hợp lý:

python Copy
import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser(
    user_agent="Mozilla/5.0 (compatible; data-collector)"
)

browser.open("https://httpbingo.org/forms/post")
# browser.page giờ đây là một đối tượng BeautifulSoup mà bạn có thể truy vấn trực tiếp

browser.open() trả về phản hồi requests; browser.page là cây BeautifulSoup đã phân tích cho trang bạn vừa tải.


Triển khai cơ bản: điền và gửi một mẫu

Vòng lặp cốt lõi là ba cuộc gọi — chọn mẫu, gán các trường của nó, gửi đi. select_form nhận một bộ chọn CSS; gán trường theo kiểu từ điển trên trình duyệt; submit_selected() đăng mẫu và theo dõi chuyển hướng.

python Copy
import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser(
    user_agent="Mozilla/5.0 (compatible; data-collector)"
)
browser.open("https://httpbingo.org/forms/post")

# Nhắm vào mẫu theo hành động của nó, sau đó điền các trường theo tên
browser.select_form('form[action="/post"]')
browser["custname"] = "Ada Lovelace"
browser["custtel"] = "555-0100"
browser["custemail"] = "ada@example.com"
browser["size"] = "medium"             # nút radio
browser["topping"] = ["bacon", "cheese"]  # hộp kiểm nhiều giá trị
browser["comments"] = "Để trước cửa"

response = browser.submit_selected()
print(response.status_code)
data = response.json()
print(data["url"])
print(data["form"])

Điểm cuối httpbin phản hồi lại cơ thể mẫu đã phân tích, điều này xác nhận chính xác những gì MechanicalSoup đã gửi:

json Copy
{
  "url": "https://httpbingo.org/post",
  "form": {
    "comments": "Để trước cửa",
    "custemail": "ada@example.com",
    "custname": "Ada Lovelace",
    "custtel": "555-0100",
    "delivery": "",
    "size": "medium",
    "topping": ["bacon", "cheese"]
  }
}
// Các giá trị phản ánh quá trình gửi thật; "delivery" trống là một trường chưa được thiết lập trên mẫu.

Nút radio nhận một chuỗi đơn, nhóm hộp kiểm nhận một danh sách, và bất kỳ trường nào không được thiết lập đều được gửi với giá trị trống — cùng một mã hóa mà trình duyệt sản xuất.


Các mẫu nâng cao

Giữ cookies qua một phiên làm việc

Một StatefulBrowser tái sử dụng một requests.Session, vì vậy bất kỳ cookie nào mà máy chủ thiết lập sẽ tồn tại đến các yêu cầu tiếp theo tự động. Đó là lý do khiến việc đăng nhập và các quy trình nhiều bước hoạt động:

python Copy
import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser()

# Máy chủ thiết lập một cookie trên yêu cầu này
browser.open("https://httpbingo.org/cookies/set?session_id=abc123")
print(browser.session.cookies.get_dict())
# {'session_id': 'abc123'}

# Một yêu cầu sau đó trên cùng một trình duyệt gửi cookie đã lưu trở lại
echo = browser.open("https://httpbingo.org/cookies")
print(echo.json())
# {'cookies': {'session_id': 'abc123'}}

Đối với một lần đăng nhập thực sự, hãy gửi mẫu đăng nhập trước, sau đó tiếp tục sử dụng cùng một đối tượng browser — cookie xác thực sẽ theo cùng trên mỗi trang tiếp theo.

Gửi một mẫu tìm kiếm và thu thập kết quả

Một mẫu tìm kiếm GET cũng theo cùng một mẫu: thiết lập trường truy vấn, gửi đi, phân tích các hàng kết quả ra khỏi browser.page.

python Copy
import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser(
    user_agent="Mozilla/5.0 (compatible; data-collector)"
)
browser.open("https://www.scrapethissite.com/pages/forms/")

browser.select_form('form[action="/pages/forms/"]')
browser["q"] = "boston"
browser.submit_selected()
print(browser.url)  # https://www.scrapethissite.com/pages/forms/?q=boston

rows = browser.page.select("table.table tr.team")
print(f"{len(rows)} hàng")
for row in rows[:3]:
    name = row.select_one(".name").get_text(strip=True)
    year = row.select_one(".year").get_text(strip=True)
    wins = row.select_one(".wins").get_text(strip=True)
    print(name, year, "thắng:", wins)

Vì trang kết quả được máy chủ tạo ra, các hàng đã có trong HTML mà MechanicalSoup đã giữ — không cần fetch thứ hai.
Lấy khóa API của bạn trên kế hoạch miễn phí: app.scrapeless.com


Nơi MechanicalSoup dừng lại: các trang được hiển thị trong trình duyệt

MechanicalSoup chỉ đưa cho BeautifulSoup những gì máy chủ trả về qua HTTP — không hơn không kém. Khi một trang xây dựng nội dung của nó bằng JavaScript phía khách hàng, HTML thô đó chỉ là một vỏ rỗng, và các bộ chọn không tìm thấy gì cả:

python Copy
import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser()
browser.open("https://quotes.toscrape.com/js/")
quotes = browser.page.select(".quote .text")
print("Số câu trích dẫn MechanicalSoup tìm thấy:", len(quotes))
# Số câu trích dẫn MechanicalSoup tìm thấy: 0

Không có gì cả. Biến thể /js/ của trang đó chèn câu trích dẫn bằng JavaScript sau khi tải, vì vậy không có gì trong HTML của máy chủ để BeautifulSoup khớp. Cùng một bức tường xuất hiện trước các trang có thử thách chống bot hoặc chỉ phục vụ nội dung cho một IP dân cư — bất kỳ điều nào mà một khách hàng chỉ HTTP không thể vượt qua.

Biện pháp khắc phục giữ lại mọi thứ bạn đã viết. Để Scrapeless Scraping Browser thực hiện việc hiển thị: SDK sẽ khởi tạo một phiên đám mây, Playwright sẽ kết nối với nó qua CDP và chạy JavaScript của trang, và bạn sẽ truyền HTML đã được hiển thị thẳng vào cùng một bộ chọn BeautifulSoup.

Cài đặt SDK và một khách hàng Playwright, sau đó lấy nhị phân trình duyệt mà Playwright điều khiển:

bash Copy
pip install scrapeless playwright beautifulsoup4
python -m playwright install chromium

Đặt khóa của bạn trong môi trường — không bao giờ mã hóa cứng:

bash Copy
export SCRAPELESS_API_KEY="your_api_token_here"

Bây giờ hiển thị trang ở phía đám mây và phân tích kết quả cục bộ:

python Copy
import os
from scrapeless import Scrapeless
from scrapeless.types import ICreateBrowser
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

client = Scrapeless()  # đọc SCRAPELESS_API_KEY từ môi trường

# Khởi tạo một phiên đám mây; cố định xuất khẩu dân cư Mỹ cho các trang ràng buộc theo địa lý
session = client.browser.create(ICreateBrowser(
    session_name="mechanicalsoup-guide",
    session_ttl=180,
    proxy_country="US",
))

with sync_playwright() as p:
    # browser_ws_endpoint là một URL CDP kiểu wss:// tiêu chuẩn
    browser = p.chromium.connect_over_cdp(session.browser_ws_endpoint)
    page = browser.contexts[0].pages[0]
    page.goto("https://quotes.toscrape.com/js/", wait_until="domcontentloaded")
    page.wait_for_selector(".quote .text")
    html = page.content()
    browser.close()

# Phân tích BeautifulSoup giống như bạn đã dùng với MechanicalSoup
soup = BeautifulSoup(html, "html.parser")
quotes = soup.select(".quote .text")
print("Số câu trích dẫn Scrapeless + BeautifulSoup tìm thấy:", len(quotes))
print(quotes[0].get_text())
# Số câu trích dẫn Scrapeless + BeautifulSoup tìm thấy: 10
# “Thế giới mà chúng ta đã tạo ra là một quá trình suy nghĩ của chúng ta. …”

Trang trả về 0 hàng cho MechanicalSoup thì lại trả về 10 thông qua trình duyệt đám mây, vì JavaScript thực sự đã chạy trước khi HTML được đọc. Việc hiển thị và xuất khẩu di chuyển sang phía đám mây; lớp phân tích — soup.select(...) — là giống hệt. Đối với một cách tiếp cận tự nhiên của thư viện về cùng một sự gia tăng, hướng dẫn trình duyệt đám mây Scrapling điều hướng một bộ lấy dữ liệu thích ứng qua cùng một browser_ws_endpoint.


Khắc phục sự cố

Triệu chứng Nguyên nhân Biện pháp
LinkNotFoundError trên select_form Bộ chọn CSS không khớp với bất kỳ form nào trên trang In browser.page.select("form") và nhắm đến thuộc tính action/thật sự
Bộ chọn kết quả trả về danh sách rỗng Trang hiển thị nội dung của nó bằng JavaScript Hiển thị nó ở phía đám mây với Trình duyệt Scraping, sau đó phân tích HTML trả về
Gửi đi bỏ qua một trường Trường là radio/checkbox cần một chuỗi hoặc danh sách, không phải giá trị đơn Gán một chuỗi đơn cho radio, một danh sách cho nhóm checkbox
Trang đã đăng nhập hoạt động như chưa đăng nhập Một StatefulBrowser mới (hộp cookie mới) cho mỗi bước Tái sử dụng một đối tượng browser để cookie phiên vẫn tồn tại
Trang trả về một thử thách thay vì nội dung Chống bot hoạt động hoặc một kiểm tra khu vực trên khách hàng chỉ HTTP Cố định proxy_country và để trình duyệt đám mây với dấu vân tay hiển thị trang thật

Kết luận: giữ lại bộ phân tích, thay thế bộ lấy dữ liệu

MechanicalSoup là công cụ thích hợp cho một tập hợp lớn các trang web vẫn chỉ có HTML đơn giản và biểu mẫu: mở một trang, select_form, gán các trường, submit_selected(), và đọc các hàng từ BeautifulSoup. Hộp cookie giúp việc đăng nhập và các quy trình nhiều bước hoạt động mà không cần mã bổ sung. Rào cản duy nhất của nó là JavaScript — nó đọc HTML, không hiển thị nó. Khi một trang web tự xây dựng trong trình duyệt hoặc bị chặn bởi tường chống bot, cách khắc phục tốt nhất là chỉ thay đổi cách truy xuất: tạo một phiên Scrapeless, hiển thị trang qua CDP, và feed HTML kết quả vào cùng các bộ chọn. Khi trang cần một trình duyệt không có đầu hoàn chỉnh với proxy riêng, hướng dẫn Puppeteer proxy đề cập đến cùng một mô hình phía đám mây, và tài liệu Scraping Browser ghi lại toàn bộ bề mặt CDP. Ghim US egress cho các trang giới hạn địa lý, tái sử dụng một phiên qua các bước, và coi các trường vắng mặt là có thể null.


Sẵn sàng để Xây Dựng Quy Trình Dữ Liệu AI của Bạn?

Tham gia cộng đồng của chúng tôi để nhận gói miễn phí và kết nối với các nhà phát triển đang xây dựng quy trình tự động hóa biểu mẫu và rendering: Discord · Telegram.

Đăng ký tại app.scrapeless.com để có thời gian chạy Scraping Browser miễn phí và điều chỉnh các mẫu ở trên cho các biểu mẫu, đăng nhập và các trang đã được hiển thị mà quy trình làm việc của bạn cần. Xem giá cả cho quy mô.


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

Q: MechanicalSoup có chạy JavaScript không?
Không. MechanicalSoup bao bọc requests và BeautifulSoup, vì vậy nó chỉ nhìn thấy HTML mà máy chủ trả về. Những trang xây dựng nội dung phía máy khách sẽ trở lại trống; hiển thị những thứ đó qua trình duyệt đám mây và phân tích HTML kết quả với cùng các bộ chọn BeautifulSoup.

Q: MechanicalSoup xử lý đăng nhập và phiên như thế nào?
Một StatefulBrowser duy nhất tái sử dụng một requests.Session, vì vậy bất kỳ cookie nào mà máy chủ thiết lập sẽ tồn tại cho mọi yêu cầu sau đó tự động. Gửi biểu mẫu đăng nhập một lần, sau đó tiếp tục sử dụng cùng một đối tượng trình duyệt và cookie xác thực sẽ đi theo.

Q: Làm thế nào để tôi chọn một biểu mẫu cụ thể trên một trang?
Chuyển một bộ chọn CSS vào select_form, ví dụ browser.select_form('form[action="/post"]'). Nếu không có biểu mẫu nào khớp, bạn sẽ nhận được một LinkNotFoundError — in browser.page.select("form") để xem các thuộc tính thực tế và nhắm đến một trong số chúng.

Q: Việc thu thập dữ liệu từ một trang bằng MechanicalSoup có hợp pháp không?
Việc thu thập dữ liệu công khai là thường được phép, nhưng các quy tắc khác nhau tùy theo khu vực pháp lý và theo điều khoản dịch vụ của trang web. Xem xét các điều khoản dịch vụ của mục tiêu, tôn trọng chỉ thị robot, tránh dữ liệu cá nhân hoặc dữ liệu hạn chế, và tư vấn luật sư cho bất kỳ điều gì không rõ ràng.

Q: Tôi có cần một proxy với MechanicalSoup không?
Đối với các trang mở, được máy chủ hiển thị, thường là không. Đối với các trang chỉ phục vụ nội dung theo khu vực hoặc chỉ phục vụ nội dung cho IP dân cư, định tuyến truy xuất qua Scrapeless Scraping Browser và ghim proxy_country để yêu cầu ra từ một IP mà trang web tin tưởng.

Q: Tôi có thể giữ mã BeautifulSoup của mình khi chuyển sang trình duyệt đám mây không?
Có. Trình duyệt đám mây chỉ thay thế bước truy xuất — nó trả về HTML đã được hiển thị, mà bạn phân tích với cùng các lệnh gọi soup.select(...) mà bạn đã sử dụng với MechanicalSoup. Lớp phân tích không thay đổ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