Tại Sao Bộ Chọn (Selector) Của Tôi Cứ Bị Lỗi? Chẩn Đoán Thực Tế

Tại Sao Bộ Chọn (Selector) Của Tôi Cứ Bị Lỗi?

Scrapeless Agent Browser cung cấp các phiên trình duyệt điều khiển từ xa để kiểm tra các trang đã render và trích xuất dữ liệu từ các website động.

Tóm tắt

  • Một bộ chọn có thể lỗi vì tài liệu đã thay đổi hoặc vì bạn truy vấn sai trạng thái. So sánh biểu diễn của trang trước khi chỉnh sửa biểu thức.
  • Một bộ chọn khớp không nhất thiết là đúng. Hãy kiểm tra danh tính bản ghi và ý nghĩa của trường cũng như số lượng kết quả khớp.
  • Các class sinh tự động và đường dẫn vị trí tạo ra các phụ thuộc có thể tránh được. Ưu tiên các thuộc tính ổn định và các mối quan hệ bên trong bản ghi dự định.
  • Frame, shadow root và việc render trễ cần được xử lý tường minh. Một biểu thức CSS dài hơn không thể băng qua mọi ranh giới tài liệu.

Chẩn Đoán Lỗi Trước Khi Viết Lại Bộ Chọn

Một bộ chọn cứ bị lỗi khi các giả định của nó về tài liệu không còn đúng. Những giả định đó bao gồm thuộc tính của phần tử, vị trí của nó, tài liệu chứa nó và thời điểm chạy truy vấn. Việc thiết kế lại trang chỉ là một nguyên nhân có thể xảy ra.

Hãy bắt đầu bằng cách lưu lại một bản ghi lỗi nhỏ: URL được yêu cầu, URL cuối cùng, tiêu đề trang, ảnh chụp màn hình, thị trường đã chọn, markup liên quan, biểu thức selector và số lượng kết quả khớp quan sát được. Ẩn cookie và thông tin xác thực. So sánh bản ghi đó với một lần thu thập thành công của cùng loại trang. Ảnh chụp một lưới đã có dữ liệu bên cạnh phản hồi HTML trống gợi ý sự không khớp về biểu diễn, trong khi tên class thay đổi trong markup vốn tương tự gợi ý một phụ thuộc về cấu trúc.

Các quy tắc khớp CSS selector mô tả cách một biểu thức khớp phần tử trong cây. Chúng không hề hứa rằng class của một site sẽ ổn định hoặc rằng phần tử khớp sẽ chứa trường nghiệp vụ mà bạn muốn. Hãy coi selector như một cách triển khai yêu cầu dữ liệu: tìm giá của sản phẩm này ở thị trường này. Yêu cầu đó phải tiếp tục đúng ngay cả khi biểu thức buộc phải thay đổi.

Tách Trôi Dạt Cấu Trúc Khỏi Trạng Thái Sẵn Sàng Và Phạm Vi

Các triệu chứng khác nhau cần các hướng điều tra khác nhau. Thay một class selector không thể sửa được một điều hướng đã mở trang đăng nhập, và đợi lâu hơn không thể khiến một selector tự động đi vào một frame riêng biệt.

Quan sátRanh giới có khả năngBằng chứng tiếp theo hữu ích
Không có kết quả khớp trong HTML phản hồi nhưng nội dung nhìn thấy trong trình duyệtBiểu diễnSo sánh phản hồi gốc và DOM đã render
Không có kết quả khớp trước khi một lưới xuất hiệnTrạng thái sẵn sàngKiểm tra phần tử chứa dữ liệu sau khi render
Có nhiều kết quả khớp trong khi chỉ mong đợi mộtPhạm viXác định các thẻ card trùng lặp, bản sao ẩn và container
Văn bản trông đúng nhưng thuộc về sai sản phẩmDanh tính bản ghiKiểm tra URL sản phẩm hoặc mã định danh mục ổn định
Selector hoạt động trong DevTools nhưng không hoạt động trong truy vấn tự động hoáNgữ cảnh tài liệuXác nhận frame, shadow root và trang đang hoạt động

Đây là các loại chẩn đoán, không phải bộ phân loại chứng minh nguyên nhân. Hãy ghi lại bằng chứng trước khi quyết định loại nào áp dụng. Nhiều ranh giới có thể cùng lúc lỗi: một prompt vùng có thể vừa trì hoãn việc render vừa thay đổi cấu trúc lưới.

Ưu Tiên Các Thuộc Tính Có Ràng Buộc Ý Nghĩa

Các selector ổn định phụ thuộc vào ngữ nghĩa ổn định, không phải cú pháp ngắn. Một class dùng cho style sinh tự động có thể mô tả một sản phẩm build; một mã định danh sản phẩm có thể mô tả đúng bản ghi bạn thực sự cần. Hãy kiểm tra xem một thuộc tính có gắn với cùng ý nghĩa trên các loại trang khác nhau trước khi sử dụng nó.

Trên một site bạn kiểm soát, các thuộc tính dành riêng cho test hoặc trích xuất có thể cung cấp một ràng buộc tường minh. Phối hợp cách đặt tên với nhóm ứng dụng và ghi rõ chúng nhận diện một phần tử hay một tập hợp. Trên một trang bên thứ ba, một thuộc tính data chỉ là markup được quan sát cho đến khi bạn có bằng chứng rằng nó bền vững. Tên của nó tự thân không tạo ra bảo đảm hỗ trợ.

Một chuỗi hậu duệ (descendant) dài tạo phụ thuộc vào từng container trung gian. Việc gỡ một wrapper bố cục có thể làm đứt chuỗi đó ngay cả khi phần tử đích không đổi. Một biểu thức theo vị trí tạo phụ thuộc vào thứ tự anh em. Một ô quảng cáo được chèn thêm có thể dịch chuyển vị trí mà không thay đổi sản phẩm. Hãy ưu tiên một container bản ghi hẹp và một selector trường bên trong nó khi markup hỗ trợ thiết kế đó.

Tránh việc dự phòng vô điều kiện sang giá đầu tiên khớp ở bất kỳ đâu trên trang. Các phương án dự phòng rộng có thể trả về giá khuyến mãi điều hướng, giá bị gạch bỏ hoặc giá sản phẩm liên quan. Hãy định nghĩa trước các phương án thay thế được phép và yêu cầu mỗi phương án phải thoả cùng một kiểm tra danh tính bản ghi. Một giá trị thiếu thì dễ điều tra hơn một giá trị có vẻ hợp lý nhưng âm thầm gắn với sai mục.

Truy Vấn Biểu Diễn Chứa Trường

HTML phản hồi và DOM hiện tại của trình duyệt có thể chứa thông tin khác nhau. Mô hình phân tích HTML và thực thi script giải thích tại sao việc phân tích một tài liệu đã tải xuống không tái tạo được mọi cập nhật ứng dụng về sau. Hãy kiểm tra biểu diễn thay vì giả định chế độ xem nguồn khớp với nội dung trên màn hình.

Nếu một nguồn có cấu trúc được ủy quyền đã chứa các bản ghi cần thiết, hãy đánh giá xem lược đồ của nó có cung cấp một hợp đồng rõ ràng hơn so với đánh dấu trực quan hay không. Kiểm tra xem nguồn đó có được dùng cho mục đích của bạn hay không, liệu các định danh của nó có còn ý nghĩa hay không, và liệu các giá trị có phản ánh cùng thị trường và trạng thái bộ lọc hay không. Một phản hồi có cấu trúc vẫn có thể không đầy đủ hoặc tham chiếu đến một ngữ cảnh khác.

Đối với nội dung được render, hãy thiết lập một điều kiện sẵn sàng cụ thể cho từng trường. Một cột mốc điều hướng có thể xảy ra trước khi danh sách sản phẩm được điền. Một khoảng trễ cố định có thể tình cờ hoạt động với một lần ghi và bỏ lỡ lần khác. Hãy định nghĩa một bản ghi sẵn sàng trông như thế nào: định danh của nó xuất hiện, tiêu đề thuộc về mục mong đợi, và trường bắt buộc đã đạt đến trạng thái chấp nhận được.

sự phân biệt giữa việc phân tích HTML và việc render trong trình duyệt giúp xác định vị trí quyết định này. Hãy chọn biểu diễn trước, rồi mới chọn công cụ trích xuất. Việc thay thế thư viện selector này bằng thư viện khác sẽ không tạo ra dữ liệu không tồn tại trong markup được cung cấp.

Kiểm tra Frames, Shadow Root và Trang đang hoạt động

Một truy vấn selector chạy trong một ngữ cảnh cụ thể. Một iframe chứa một tài liệu riêng; một cây shadow có ranh giới đóng gói riêng. Hãy xác nhận rằng truy vấn tự động hóa hoạt động trên cùng ngữ cảnh mà bạn đã kiểm tra thủ công.

mô hình cây DOM cung cấp ngôn ngữ nền tảng cho các node và ranh giới cây. Trong thực tế, hãy xác định frame bao chứa hoặc shadow root có thể truy cập được trước khi định vị phần tử. Giữ truy vấn trong ngữ cảnh được thư viện hỗ trợ thích hợp. Đừng giả định rằng một truy vấn ở cấp tài liệu sẽ đi xuyên qua mọi ranh giới chỉ vì trình duyệt hiển thị toàn bộ nội dung trong một cửa sổ.

Cũng hãy kiểm tra lại trang đang hoạt động sau một cú nhấp. Một liên kết có thể mở trong tab mới trong khi trang gốc vẫn còn. Selector của tab cũ vẫn có thể khớp với thứ gì đó, vì vậy một kết quả không rỗng không bộc lộ được sai sót. Hãy ghi lại URL đích và danh tính trang trước khi trích xuất các trường.

Giao diện được ảo hóa giới thiệu một sự khác biệt khác: một danh sách hiển thị không nhất thiết giữ mọi bản ghi trong DOM cùng một lúc. Hãy xác định liệu tác vụ của bạn thu thập phân đoạn hiện đang được render hay toàn bộ bộ dữ liệu đã phê duyệt. Số lượng thẻ DOM không nên được báo cáo là tổng tồn kho của nguồn nếu không có một kiểm tra tính đầy đủ riêng.

Xác thực một Bản ghi, Không chỉ một Kết quả khớp

Việc trích xuất chỉ thành công khi bản ghi thu được đáp ứng hợp đồng trường của nó. Hãy xác định các trường bắt buộc, trường tùy chọn, định dạng chấp nhận được và một danh tính ổn định trước khi kết nối scraper với hệ thống lưu trữ phía sau.

Đối với bản ghi giá, hãy yêu cầu danh tính sản phẩm và ngữ cảnh tiền tệ bên cạnh giá trị số. Quyết định cách phân biệt giữa một giá không khả dụng và một phần tử bị thiếu. Đối với bản ghi bài viết, hãy giữ lại URL nguồn và tiêu đề, rồi kiểm tra xem đoạn văn bản được chọn có phải là phần thân bài hay không chứ không phải các liên kết liên quan. Những kiểm tra này khiến lỗi trở nên nhìn thấy được ngay cả khi một selector trả về văn bản.

Hãy dùng tính lực lượng (cardinality) một cách có chủ đích. Một trang chi tiết sản phẩm có thể yêu cầu một mục được chọn, trong khi một trang kết quả hợp lệ chứa nhiều mục. Nếu một selector chi tiết trả về nhiều bản ghi, hãy dừng việc chấp nhận và kiểm tra các bản trùng lặp. Nếu một danh sách không trả về gì, hãy phân biệt giữa trạng thái trống rõ ràng với một trang bị chặn hoặc một lần render chưa hoàn tất.

Tránh điền các giá trị bắt buộc từ một lần ghi trước đó. Điều đó tạo ra một bản ghi trông như mới nhưng bằng chứng thì cũ. Hãy giữ quan sát thất bại tách biệt với quan sát hợp lệ gần nhất. Người dùng phía sau nên có thể phân biệt dữ liệu hiện tại, dữ liệu vắng mặt và dữ liệu không thể thu thập.

Duy trì Các Bản Ghi Nhỏ cho Những Biến Thể Trang Đã Biết

Một tập bảo trì selector nên đại diện cho các biến thể trang mà quy trình làm việc của bạn hỗ trợ. Bao gồm một bản ghi bình thường, một trạng thái trống rõ ràng, một trường tùy chọn, và từng thị trường hoặc bố cục ảnh hưởng đến việc trích xuất. Hãy chỉ lưu markup cần thiết cho việc chẩn đoán khi các bản ghi đầy đủ chứa thông tin nhạy cảm.

Hãy xem xét các thay đổi selector so với tập này trước khi phát hành chúng. Một selector thay thế sửa được ảnh chụp màn hình mới nhất có thể làm hỏng một kiểu trang khác. Hãy so sánh cả số lượng kết quả khớp và danh tính trường, và ghi lại giả định cấu trúc cụ thể mà mỗi selector sử dụng.

Nếu bạn kiểm soát website, hãy coi các thuộc tính trích xuất như một giao diện và đưa chúng vào quy trình xem xét thay đổi ứng dụng. Nếu bạn thu thập một trang bên thứ ba, hãy chỉ định một người phụ trách việc xem xét bản ghi và cho phép một hợp đồng bị lỗi cô lập các bản ghi. Việc trích xuất tự động sẽ được lợi từ một điều kiện dừng rõ ràng khi bằng chứng không còn hỗ trợ việc chấp nhận.

mô hình phiên Agent Browser cung cấp môi trường trình duyệt để quan sát trạng thái động. Scrapeless Agent Browser không quyết định selector nào đại diện cho trường nghiệp vụ của bạn. Hãy giữ việc lưu trữ trình duyệt, mức độ sẵn sàng của tài liệu và việc xác thực bản ghi là những trách nhiệm riêng biệt. Xem lại Scrapeless pricing so với khối lượng phiên thực tế mà việc chẩn đoán của bạn yêu cầu.

Kết luận: Sửa Giả Định Đã Bị Lỗi

Khi một selector hỏng, hãy so sánh danh tính trang, kiểu biểu diễn, trạng thái sẵn sàng và ngữ cảnh truy vấn trước khi thay đổi cú pháp của nó. Sau đó chọn selector hẹp nhất nhưng có ý nghĩa và xác thực bản ghi mà nó tạo ra. Trình tự đó bắt được cả những phần tử thiếu rõ ràng lẫn trường hợp tốn kém hơn khi một scraper trả về dữ liệu có vẻ hợp lý từ sai vị trí.

Kiểm tra Trạng thái Trang của Bạn với Agent Browser

Sử dụng một phiên trình duyệt để kiểm tra một trang động được ủy quyền, rồi áp dụng các kiểm tra rõ ràng cho các trường mà quy trình làm việc của bạn chấp nhận.

Đăng ký ngay hôm nay và nhận $5 in free credit — không cần thẻ tín dụng.

Nhận $5 Credit của bạn →

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

H: Tại sao một selector hoạt động trong DevTools nhưng lại lỗi trong scraper?

Một bộ chọn có thể hoạt động trong DevTools vì trang được kiểm tra có khung khác, trạng thái đã render khác hoặc tài liệu đang hoạt động khác so với truy vấn của trình thu thập. So sánh ngữ cảnh và ghi lại thời điểm trước khi viết lại bộ chọn. Việc kiểm tra thủ công thường diễn ra sau khi ứng dụng đã điền vào các trường cần thiết.

Hỏi: Các thuộc tính data có luôn ổn định không?

Các thuộc tính data không tự động ổn định. Trên một trang web bạn kiểm soát, chúng có thể tạo thành một hợp đồng được tài liệu hoá; trên một trang web của bên thứ ba, chúng vẫn chỉ là đánh dấu được quan sát. Kiểm tra ý nghĩa của chúng trên các biến thể trang được hỗ trợ và duy trì các bước kiểm tra chấp nhận xung quanh bản ghi đã trích xuất.

Hỏi: Trình thu thập nên dùng XPath thay vì CSS không?

XPath và CSS đều có thể phụ thuộc vào cấu trúc tài liệu không ổn định. Hãy chọn biểu thức thể hiện rõ ràng mối quan hệ cần thiết, sau đó xác minh phạm vi và danh tính trường. Chỉ thay đổi ngôn ngữ truy vấn không khắc phục được việc render muộn hoặc điều hướng đến sai trang.

Hỏi: Agent Browser có thể ngăn thay đổi bộ chọn không?

Agent Browser không thể ngăn một trang web đích thay đổi đánh dấu của nó. Nó cung cấp môi trường thực thi trình duyệt, trong khi ứng dụng của bạn chịu trách nhiệm chọn và kiểm tra dữ liệu. Giữ lại các bản chụp mang tính đại diện và phát hiện khi một hợp đồng trích xuất cần thiết bị vi phạm.

Hỏi: Chờ tải có đảm bảo trường tồn tại không?

Chờ tải không đảm bảo rằng một trường cụ thể của ứng dụng đã sẵn sàng. Một yêu cầu hoặc tương tác diễn ra sau đó có thể điền dữ liệu vào trường sau sự kiện tài liệu. Hãy chờ một điều kiện dữ liệu có thể quan sát được và xác thực bản ghi thu được trước khi lưu trữ nó.

Tài liệu tham khảo