Thu thập dữ liệu Web cơ bản bằng Selenium
Thu thập dữ liệu Web là quá trình lấy dữ liệu từ nhiều trang khác nhau trên Internet. Nếu bạn muốn biết cách bắt đầu scraping với hồ sơ Multilogin – hãy làm theo hướng dẫn này và bạn sẽ học cách tạo một tập lệnh đơn giản!
Bài viết này hướng dẫn bạn từng bước tạo kịch bản. Nếu bạn muốn tham khảo toàn bộ kịch bản, vui lòng kéo xuống cuối bài.
Bước 1: Chuẩn bị IDE hoặc phần mềm tương tự
Bạn sẽ cần bất cứ thứ gì để viết tập lệnh. Việc sử dụng cái nào là tùy bạn, nhưng chúng tôi khuyên bạn nên sử dụng IDE. Hãy làm theo 4 bước đầu tiên trong bài viết sau: Bắt đầu với tập lệnh tự động hóa.
Bước 2: Tạo tập lệnh kết nối với API và xác định các hàm
Ở bước này, bạn cần làm cho tập lệnh hoạt động với API. Tập lệnh sẽ bao gồm:
- API Endpoints
- Biến cho thông tin xác thực
- Các chức năng được xác định để đăng nhập, mở và đóng hồ sơ
- Các mô-đun được nạp vào, bao gồm
requests,hashlib,time. Một số mô-đun liên quan đến Selenium cũng sẽ được bao gồm - Yêu cầu đăng nhập
Sử dụng mẫu sau đây:
import requests
import hashlib
import time
from selenium import webdriver
from selenium.webdriver.chromium.options import ChromiumOptions
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
MLX_BASE = "https://api.multilogin.com"
MLX_LAUNCHER = "https://launcher.mlx.yt:45001/api/v1"
MLX_LAUNCHER_V2 = (
"https://launcher.mlx.yt:45001/api/v2" # recommended for launching profiles
)
LOCALHOST = "http://127.0.0.1"
HEADERS = {"Accept": "application/json", "Content-Type": "application/json"}
# TODO: Insert your account information in both variables below
USERNAME = ""
PASSWORD = ""
# TODO: Insert the Folder ID and the Profile ID below
FOLDER_ID = ""
PROFILE_ID = ""
def signin() -> str:
payload = {
"email": USERNAME,
"password": hashlib.md5(PASSWORD.encode()).hexdigest(),
}
r = requests.post(f"{MLX_BASE}/user/signin", json=payload)
if r.status_code != 200:
print(f"\nError during login: {r.text}\n")
else:
response = r.json()["data"]
token = response["token"]
return token
def start_profile() -> webdriver:
r = requests.get(
f"{MLX_LAUNCHER_V2}/profile/f/{FOLDER_ID}/p/{PROFILE_ID}/start?automation_type=selenium",
headers=HEADERS,
)
response = r.json()
if r.status_code != 200:
print(f"\nError while starting profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} started.\n")
selenium_port = response["data"]["port"]
driver = webdriver.Remote(
command_executor=f"{LOCALHOST}:{selenium_port}", options=ChromiumOptions()
)
# For Stealthfox profiles use: options=Options()
# For Mimic profiles use: options=ChromiumOptions()
return driver
def stop_profile() -> None:
r = requests.get(f"{MLX_LAUNCHER}/profile/stop/p/{PROFILE_ID}", headers=HEADERS)
if r.status_code != 200:
print(f"\nError while stopping profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} stopped.\n")
token = signin()
HEADERS.update({"Authorization": f"Bearer {token}"})Mẫu này tương tự như ví dụ tự động hóa Selenium, ngoại trừ việc nó có mô-đun được nhập sau đây ở phần đầu (chúng ta sẽ cần để thu thập dữ liệu):
from selenium.webdriver.common.by import By
Bước 3: Chọn trang web để thu thập dữ liệu
Bạn có thể sử dụng bất kỳ trang web nào có chứa văn bản, nhưng đối với hướng dẫn này, chúng tôi khuyên bạn nên thử trang này – trang này rất tuyệt để thực hành các tác vụ tự động hóa: Large & Deep DOM.
Bước 4: Tìm kiếm thông tin mục tiêu
Trong trường hợp của chúng tôi, đó sẽ là dữ liệu từ bảng dưới đây:

Chúng ta sẽ lấy tất cả các giá trị từ bảng. Sau đây là những gì bạn có thể làm:
- Mở DevTools trên trình duyệt của bạn. Sau đây là cách thực hiện đối với trình duyệt dựa trên Chromium và Firefox:
- Windows và Linux: nhấn
Ctrl + Shift + I - macOS: nhấn
Cmd + Option + I
- Windows và Linux: nhấn
- Hãy đảm bảo rằng bạn đang ở trên tab “Yếu tố”
- Sử dụng phím nóng tìm kiếm để tìm giá trị mục tiêu
- Windows và Linux:
CTRL + F - macOS:
Cmd + F
- Windows và Linux:
- Nhập giá trị văn bản bạn muốn xem. Trong trường hợp này, đó là "Table".
- Tìm giá trị bạn cần sử dụng để thu thập dữ liệu. Trong trường hợp của chúng tôi, giá trị đó sẽ là:
<table id="large-table"> - Di chuột qua phần tử có thẻ trong tab “Phần tử”
- Nhấp chuột phải rồi nhấp chuột trái “Sao chép” – “Bộ chọn sao chép”
- Viết giá trị ở đâu đó – bạn sẽ cần nó sau

Bước 5: Quay lại IDE và thêm chuỗi mã mới
- Quay lại IDE theo lựa chọn của bạn (ví dụ: VS Code)
- Nhấp vào trường mã và thêm một biến để mở và thực hiện các hành động trong hồ sơ:
driver = start_profile() - Thêm
driver.get("<trang web của bạn>"). Trong trường hợp của chúng ta, đó sẽ là lệnh sau:driver.get("https://the-internet.herokuapp.com/large") - Bây giờ chúng ta cần một số độ trễ cho tập lệnh để nó sẽ cố gắng thực hiện các lệnh khác sau 5 giây kể từ khi mở trang web:
time.sleep(5)
Bước 6: Tạo tập lệnh để tìm phần tử
Sử dụng lệnh này để tìm phần tử: driver.find_element(By.<thuộc tính trên trang>, "<phần tử>"). Lệnh này cho tập lệnh biết chính xác những gì cần tìm trên trang. Vì chúng ta đã sao chép bộ chọn CSS ở bước 4, lệnh thực tế của bạn sẽ trông như thế này:
driver.find_element(By.ID, "large-table")Chúng ta sẽ cần lấy giá trị của nó sau, vì vậy chúng ta cần tạo một biến cho lệnh, ví dụ: fetch:
fetch = driver.find_element(By.ID, "large-table")Bước 7: In kết quả cuối cùng và dừng hồ sơ
- Sử dụng hàm
print()để in kết quả cuối cùng. Vì chúng ta cần trích xuất giá trị văn bản, chúng ta cần lấy văn bản từ biến. Kết quả sẽ như sau:print(fetch.text) - Thêm chức năng dừng hồ sơ ở cuối:
stop_profile() - Lưu tập lệnh
.py, bạn sẽ cần chạy sau một số bước bổ sung
Bước 8: Chuẩn bị tập lệnh trước khi chạy nó
- Cài đặt các thư viện Python sau (tìm tài liệu của ID E của bạn để biết thêm chi tiết):
requestsselenium
- Chèn các giá trị của bạn vào các biến bên dưới trong tập lệnh:
Bước 9: Chạy tập lệnh
- Mở ứng dụng máy tính để bàn (hoặc kết nối tác nhân nếu bạn đang sử dụng giao diện web)
- Theo mặc định, tập lệnh bên dưới hoạt động với Mimic . Để sử dụng cho Stealthfox, hãy thay
options=ChromiumOptions()bằngoptions=Options()trong dòng sau:driver = webdriver.Remote(command_executor=f'{LOCALHOST}:{selenium_port}', options=ChromiumOptions()) - Chạy tệp
.pyvới mã tự động hóa của bạn
Để chạy tập lệnh trong VS Code, hãy nhấp vào “Chạy” → “Chạy mà không cần gỡ lỗi” (hoặc “Bắt đầu gỡ lỗi”).
Nếu bạn thực hiện mọi thao tác đúng, bạn sẽ có thể xem kết quả trong terminal. 
Ghi chú
Xin chúc mừng bạn với tập lệnh scraping đầu tiên! Bạn không bị giới hạn bởi những lựa chọn đó. Python và Selenium là những công cụ khá linh hoạt và có nhiều tiềm năng hơn. Dưới đây là một vài mẹo:
- Nếu bạn cần lấy nhiều giá trị theo các giá trị tương tự (ví dụ: ID ), bạn có thể sử dụng hàm sau:
driver.find_elements(By.<thuộc tính trên trang>, "<phần tử>") - Bạn có thể thêm nhiều giá trị vào hàm print(). Bạn có thể tìm hiểu thêm về nó trên Internet. Ví dụ: bạn có thể thêm văn bản trước
fetch.text. Điều này sẽ giúp kết quả in dễ đọc hơn và cũng hữu ích cho việc gỡ lỗi tập lệnh. Dưới đây là ví dụ bạn có thể thử nghiệm trong tập lệnh:print("Your values: ", fetch.text) - Có nhiều cách triển khai Selenium hơn. Hãy xem trung tâm trợ giúp của họ để biết thêm chi tiết: Selenium Documentation
Toàn bộ Script
import requests
import hashlib
import time
from selenium import webdriver
from selenium.webdriver.chromium.options import ChromiumOptions
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
MLX_BASE = "https://api.multilogin.com"
MLX_LAUNCHER = "https://launcher.mlx.yt:45001/api/v1"
MLX_LAUNCHER_V2 = (
"https://launcher.mlx.yt:45001/api/v2" # recommended for launching profiles
)
LOCALHOST = "http://127.0.0.1"
HEADERS = {"Accept": "application/json", "Content-Type": "application/json"}
# TODO: Insert your account information in both variables below
USERNAME = ""
PASSWORD = ""
# TODO: Insert the Folder ID and the Profile ID below
FOLDER_ID = ""
PROFILE_ID = ""
def signin() -> str:
payload = {
"email": USERNAME,
"password": hashlib.md5(PASSWORD.encode()).hexdigest(),
}
r = requests.post(f"{MLX_BASE}/user/signin", json=payload)
if r.status_code != 200:
print(f"\nError during login: {r.text}\n")
else:
response = r.json()["data"]
token = response["token"]
return token
def start_profile() -> webdriver:
r = requests.get(
f"{MLX_LAUNCHER_V2}/profile/f/{FOLDER_ID}/p/{PROFILE_ID}/start?automation_type=selenium",
headers=HEADERS,
)
response = r.json()
if r.status_code != 200:
print(f"\nError while starting profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} started.\n")
selenium_port = response["data"]["port"]
driver = webdriver.Remote(
command_executor=f"{LOCALHOST}:{selenium_port}", options=ChromiumOptions()
)
# For Stealthfox profiles use: options=Options()
# For Mimic profiles use: options=ChromiumOptions()
return driver
def stop_profile() -> None:
r = requests.get(f"{MLX_LAUNCHER}/profile/stop/p/{PROFILE_ID}", headers=HEADERS)
if r.status_code != 200:
print(f"\nError while stopping profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} stopped.\n")
token = signin()
HEADERS.update({"Authorization": f"Bearer {token}"})
driver = start_profile()
driver.get("https://the-internet.herokuapp.com/large")
time.sleep(5)
fetch = driver.find_element(By.ID, "large-table")
print(fetch.text)
stop_profile()Bài viết này có chứa các liên kết của bên thứ ba mà chúng tôi không chính thức xác nhận.