Lấy dữ liệu từ một trang web một cách ổn định và hiệu quả


11

Gần đây tôi đã học được rằng sử dụng regex để phân tích HTML của trang web để lấy dữ liệu bạn cần không phải là cách hành động tốt nhất.

Vì vậy, câu hỏi của tôi rất đơn giản: Điều gì sau đó, là cách tốt nhất / hiệu quả nhất và nói chung là ổn định để có được dữ liệu này?

Tôi cần lưu ý rằng:

  • Không có API
  • Không có nguồn nào khác nơi tôi có thể lấy dữ liệu từ (không có cơ sở dữ liệu, nguồn cấp dữ liệu và như vậy)
  • Không có quyền truy cập vào các tập tin nguồn. (Dữ liệu từ các trang web công cộng)
  • Giả sử dữ liệu là văn bản bình thường, được hiển thị trong bảng trong trang html

Tôi hiện đang sử dụng python cho dự án của mình nhưng một giải pháp / mẹo độc lập về ngôn ngữ sẽ rất tuyệt.

Như một câu hỏi phụ: Bạn sẽ tìm hiểu về nó như thế nào khi trang web được xây dựng bởi các cuộc gọi Ajax?

BIÊN TẬP:

Trong trường hợp phân tích cú pháp HTML, tôi biết rằng không có cách nào ổn định thực sự để lấy dữ liệu. Ngay khi trang thay đổi, trình phân tích cú pháp của bạn đã hoàn tất. Ý tôi là ổn định trong trường hợp này là: một cách hiệu quả để phân tích trang, luôn mang lại cho tôi kết quả tương tự (rõ ràng cho cùng một bộ dữ liệu) với điều kiện trang không thay đổi.


8
Không có cách nào ổn định, bất kể bạn thực hiện cách nạo như thế nào, nó có thể dễ dàng bị phá vỡ với một thay đổi đơn giản của trang web. Cách ổn định để có được dữ liệu của bạn là liên hệ với các tác giả của dữ liệu và môi giới một thỏa thuận để bạn có được dữ liệu ở định dạng lành mạnh. Đôi khi điều đó thậm chí không tốn tiền.
Joachim Sauer

1
@JoachimSauer - Câu hỏi vẫn có thể được trả lời bằng phương pháp 'tốt nhất'.
Ẩn danh

Vì hầu hết các trang web là động và lưu trữ dữ liệu của họ trong cơ sở dữ liệu, cách tốt nhất là lấy cơ sở dữ liệu từ trang web. Nếu trang web có API, bạn có thể sử dụng nó. Trong trường hợp bạn muốn cạo các trang tĩnh, thì các mô-đun urllib và HTMLParser tích hợp của Python hoạt động tốt. Một vài gói để loại bỏ HTML cũng có sẵn tại PyPi.
Ubermensch

Trang web cào là kinh doanh. Thực sự không có cách nào ổn định để làm điều này bởi vì chủ sở hữu trang web không muốn bạn và toàn bộ ngành công nghiệp đang cố gắng ngăn mọi người làm điều đó.
Steven Evers

1
Có thể nhúng trình duyệt web như Webkit và sau đó sử dụng tập lệnh DOM để lấy thông tin từ trang được hiển thị? Hầu hết mọi nền tảng đều có thể làm điều đó, nhưng đây là cách bạn thực hiện trong Qt: doc.qt.nokia.com/4.7-snapshot/qtwebkit-bridge.html
user16764

Câu trả lời:


2

Vâng, đây là 2 xu của tôi:

Nếu không có AJAX liên quan hoặc có thể xóa dễ dàng, hãy 'sửa' HTML thành XHTML (ví dụ sử dụng HTMLTidy), sau đó sử dụng XPath thay vì các biểu thức thông thường để trích xuất thông tin.
Trong một trang web có cấu trúc tốt, các thực thể thông tin được phân tách hợp lý nằm trong các <div>s khác nhau hoặc bất kỳ thẻ nào khác, điều đó có nghĩa là bạn sẽ có thể dễ dàng tìm thấy thông tin đúng với biểu thức XPath đơn giản. Điều này cũng tuyệt vời vì bạn có thể kiểm tra nó, giả sử, bảng điều khiển của Chrome hoặc bảng điều khiển dành cho nhà phát triển của Firefox và xác minh nó hoạt động trước khi viết ngay cả một dòng mã khác.
Cách tiếp cận này cũng có tỷ lệ nhiễu tín hiệu rất cao, vì thông thường các biểu thức để chọn thông tin liên quan sẽ là một lớp. Chúng cũng dễ đọc hơn các biểu thức thông thường và được thiết kế cho mục đích đó.

Nếu có AJAX và JavaScript nghiêm trọng liên quan đến trang, hãy nhúng một thành phần trình duyệt vào ứng dụng và sử dụng DOM của nó để kích hoạt các sự kiện bạn cần và XPath để trích xuất thông tin. Có rất nhiều thành phần trình duyệt có thể nhúng tốt, hầu hết đều sử dụng các trình duyệt trong thế giới thực, đây là một điều tốt, vì một trang web có thể không chính xác (X) HTML, nhưng vẫn hiển thị tốt trên tất cả các trình duyệt chính ( trên thực tế, hầu hết các trang cuối cùng có được theo cách này).


Cảm ơn, tôi chắc chắn sẽ xem xét thêm về XPath. Tôi không quen làm việc với nó, vì vậy nó sẽ là một điều tốt đẹp để học hỏi. +1 :)
Mike

5

Theo kinh nghiệm của tôi, sử dụng môi trường .NET, bạn có thể tận dụng Gói Agility HTML .

Nếu trang được định dạng là XHTML, bạn cũng có thể sử dụng trình phân tích cú pháp XML thông thường. Có rất nhiều thứ ngoài kia cho bất kỳ môi trường nào bạn có thể tưởng tượng.

Đối với câu hỏi phụ về AJAX, bạn có thể sử dụng mã mạng HTTP thông thường để lấy dữ liệu và phân tích cú pháp.

Một lần nữa nếu ngăn xếp AJAX của bạn trả về XML, bạn sẽ có rất nhiều lựa chọn. Nếu nó trả về JSON, hãy xem xét một thư viện cho phép bạn ánh xạ luồng tới các đối tượng đã nhập. Trong .NET tôi đề nghị bạn Newtonsoft.Json .


Và bằng 'mã mạng HTTP', bạn có nghĩa là nắm bắt phản hồi của máy chủ khi yêu cầu được đưa ra? Cảm ơn những lời đề nghị, tôi chắc chắn sẽ xem xét chúng. +1
Mike

Chính xác. Trong .NET, bạn có thể sử dụng System.Net.WebClient hoặc thư viện như RestSharp | restsharp.org . Tôi cũng đã sử dụng nó trên Mono cho Droid.
gsscoder

4

Phân tích cú pháp HTML không phải là một nhiệm vụ hoàn toàn tầm thường, vì người ta phải đối phó với việc đánh dấu có thể không chính xác (thẻ súp). Trong những năm qua, các trình duyệt đã thực hiện ít nhiều cùng một chiến lược để xử lý lỗi và thuật toán đó đã được đặt tên theo đặc tả HTML5 (vâng, đặc tả HTML5 chỉ định phải làm gì với những thứ không phải là HTML5).

Các thư viện cho tất cả các ngôn ngữ chính để phân tích HTML, ví dụ như ngôn ngữ này .

Trong mọi trường hợp, những gì bạn sẽ nhận được không ổn định trong bất kỳ ý nghĩa nào. Mỗi khi định dạng trang web thay đổi, bạn phải điều chỉnh bộ cạp của mình.


Cảm ơn, tôi đã sử dụng Beautiful Soup để hoàn thành công việc. Tôi biết nó sẽ không ổn định, tôi có lẽ nên làm rõ điều đó trong câu hỏi của mình. +1 cho bạn :)
Mike

4

Như một câu hỏi phụ: Bạn sẽ tìm hiểu về nó như thế nào khi trang web được xây dựng bởi các cuộc gọi Ajax?

Nếu các cuộc gọi ajax đang được thực hiện, thì rất có thể đó là một số url POST hoặc GET với một số biến.

Tôi sẽ kiểm tra JavaScript để tìm hiểu các điểm cuối và tham số là gì. Sau đó, rất có thể dữ liệu được trả về là json / xml / văn bản thuần túy hoặc có lẽ là một phần html.

Khi bạn biết các thông tin trên, bạn chỉ cần thực hiện một yêu cầu GET hoặc POST đến điểm cuối đó và phân tích dữ liệu được trả về.


2
Đáng chú ý là nhiều dịch vụ kiểm tra việc HTTP header để đảm bảo HTTP_X_REQUESTED_WITHXMLHttpRequest. Những người giỏi cũng sẽ triển khai một số loại bảo vệ XSRF cho các yêu cầu POST, vì vậy bạn cũng sẽ cần cookie ma thuật đó. Việc đánh dấu các điểm cuối AJAX không được một số API công khai cố tình cảm thấy hơi khó hiểu đối với tôi và trình cào của bạn cũng dễ bị hỏng nếu đầu ra (hoặc chính sách yêu cầu) thay đổi.
Tim Post

@TimPost bạn đúng 100%. Tôi thực sự đồng ý "icky" của nó thực sự :) nhưng trong trường hợp không có bất kỳ API công khai nào, thì cần phải ..
Darknight

Tôi có thể sử dụng ứng dụng này trên ứng dụng AJAX do chính tôi tạo ra (và 'của chính tôi' Tôi không có nghĩa là tôi đã viết nó nhưng thiết lập là của tôi) nhưng tôi không cảm thấy đúng khi thử và bỏ qua hệ thống của máy chủ khác vì vậy tôi phải đồng ý với @ TimPost, nó cảm thấy như 'icky'. Đó là một ý tưởng tốt, tuy nhiên, cảm ơn! +1!
Mike

1

Không có cách nào ổn định hoặc tốt hơn để làm điều này, các trang web HTML không được tạo ra để bị máy tính thao túng. Nó dành cho người dùng, nhưng nếu bạn cần làm điều đó, tôi khuyên bạn nên sử dụng trình duyệt và một số javascript. Trong công việc của tôi, tôi đã tham gia vào một dự án cần trích xuất một số thông tin từ trang web của bên thứ ba. Ứng dụng được phát triển dưới dạng tiện ích mở rộng của Chrome. Logic ứng dụng được viết bằng cách sử dụng javascript được chèn trên trang web sau khi tải Trang hoàn tất. Dữ liệu được trích xuất được gửi đến cơ sở dữ liệu thông qua máy chủ http. Nó không phải là cách tiếp cận tốt nhất, nhưng nó hoạt động. Ps: Chủ sở hữu trang web đã ủy quyền cho chúng tôi làm điều đó.


Tôi biết rằng các trang HTML không được phân tích cú pháp bởi máy tính nhưng đôi khi đơn giản là không có tùy chọn nào khác. Ngoài ra, tôi đang sử dụng thông tin có sẵn công khai cho một dự án cá nhân không mang tính thương mại dưới bất kỳ hình thức nào, tôi không nghĩ rằng tôi cần ủy quyền rõ ràng, phải không? Cảm ơn vì đầu vào của bạn! +1 cho bạn nữa;)
Mike

@MikeHeremans Để biết liệu bạn có được phép lấy thông tin từ một trang web hay không, hãy đọc ToS và robot.txt. Nếu cả hai không từ chối bạn quyền tự động loại bỏ thông tin, có lẽ bạn sẽ ổn trong hầu hết các trường hợp về mặt pháp lý. Tất nhiên, IANAL ...
K.Steff

Nếu bạn muốn xem mã của dự án được đề cập: code.google.com/p/acao-toolkit/source/browse/ . Kiểm tra content_script.js, đó là mã được chèn trên trang.
nohros
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.