2013-11-26 13 views
5

Tôi cần tải xuống trang web sau: http://m.10bet.com/#leage_panel#10096Site scraping: Chờ cho đến khi trang web được tải hoàn toàn

Đây là trang thể thao và tôi cần báo giá. Vì vậy, ở nơi đầu tiên điều này có vẻ khá đơn giản. Tuy nhiên, đây là những gì xảy ra (bạn có thể kiểm tra điều này với ví dụ như công cụ phát triển của trình duyệt của bạn.):

  1. Mở URL
  2. Trang tải một HTML ban đầu mà sau đó gọi một yêu cầu ajax để lấy dấu ngoặc kép
  3. Tuy nhiên, báo giá được chứa trong json NHƯNG chúng được obfruscated như vậy mà nó không thể đơn giản phân tích chúng trực tiếp từ cuộc gọi ajax. Ngoài ra, javascript của trang web được obfruscated là tốt. Vì vậy, không có cơ hội để trực tiếp đọc báo giá từ yêu cầu.

Thay vào đó, tôi sẽ cần sử dụng trình duyệt không có khả năng đánh giá javascript. HtmlUnit cho java là không đủ vì nó không cung cấp chức năng javascript mạnh mẽ. Do đó PhantomJS kết hợp với CasperJS là lựa chọn hiện tại của tôi. Tôi áp dụng CasperJS với tập lệnh sau:

var casper = require('casper').create(); 

casper.start('http://m.10bet.com/#leage_panel#10096', function() { 
    var url = 'http://m.10bet.com/#leage_panel#10096'; 
    this.download(url, '10bet.html'); 
}); 

casper.run(function() { 
    this.echo('Done.').exit(); 
}); 

Tuy nhiên, tập lệnh này không tải trang đầy đủ. Chỉ là trang inital. Làm cách nào để tải trang web hoàn chỉnh như được trình bày trong trình duyệt?

+0

Tôi không quen với các công cụ đó, nhưng bạn có thể đính kèm mã của mình vào sự kiện 'domready' không? Điều đó có thể làm điều đó. – halfer

Trả lời

7

Kịch bản đó trông giống như một khởi đầu tốt, nhưng ngay sau khi trang (HTML) của bạn tải, kịch bản (CasperJS) dừng lại, bởi vì bạn chưa đưa ra bất kỳ hướng dẫn nào khác. Cách thô thiển để sửa lỗi này sẽ đi vào giấc ngủ cho một vài giây, sau đó cạo trang:

var casper = require('casper').create(); 
var fs=require('fs'); 

casper.start('http://m.10bet.com/#leage_panel#10096', function() { 
    this.wait(2000, function() { 
     fs.write("10bet.html", this.getHTML()); 
    }); 
}); 

casper.run(); 

Một 2000 mili giây time-out là thô cho một vài lý do:

  1. Nếu dữ liệu tải nhanh hơn bạn đang lãng phí thời gian.
  2. Nếu tải chậm hơn, tập lệnh của bạn không hoạt động.

Vì vậy, nó là tốt hơn để xác định một cái gì đó trên trang mà bạn muốn và cần phải có mặt ở đó, và sau đó sử dụng một trong những chức năng waitForXXX() Casper của. Xem tài liệu API bắt đầu tại đây: http://casperjs.readthedocs.org/en/latest/modules/casper.html#waitfor

Một điểm khác, tôi đoán bạn không thực sự muốn toàn bộ trang HTML, chỉ là dữ liệu trong đó. getHTML() lấy một tham số để lọc những gì được nhận. Ví dụ. trong trường hợp của bạn getHTML('#league_block') có thể hữu ích hơn nhiều. Một lần nữa, hãy xem tài liệu API để có thêm ý tưởng.

+0

Xin chào Darren! Bạn đã quá nhanh. Tôi chỉ muốn gửi đề xuất của bạn như là một câu trả lời cho câu hỏi của tôi. Tôi đã sử dụng waitForResource (...). Hoạt động hoàn hảo tốt. Cảm ơn bạn đã giúp đỡ! :) – toom

Các vấn đề liên quan