MechanicalSoup: Tự động hóa việc thu thập dữ liệu từ biểu mẫu trong Python
Senior Web Scraping Engineer
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
requestsvới BeautifulSoup. Một đối tượngStatefulBrowsermở 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ộtStatefulBrowsergử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_formcộ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, đặtbrowser["fieldname"] = value, và gọisubmit_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à
StatefulBrowsersẽ 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ẩn —
browser_ws_endpointlà 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 requests và beautifulsoup4 làm các phụ thuộc:
bash
pip install mechanicalsoup
Xác nhận việc cài đặt và phiên bản:
bash
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
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
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
{
"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
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
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
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
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
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
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.



