2009-02-05 26 views
17

Tôi đang sử dụng C# HttpWebRequest để lấy một số dữ liệu của trang web. Vấn đề là một số dữ liệu được cập nhật bằng cách sử dụng javascript/ajax sau khi trang được tải và tôi không nhận được nó trong chuỗi phản hồi. Có cách nào để yêu cầu webrequest chờ cho đến khi tất cả các tập lệnh trong trang đã hoàn tất việc thực thi không?C# httpwebrequest và javascript

Cảm ơn

Amit

Trả lời

8

Nếu tôi hiểu đúng câu hỏi của bạn, không có giải pháp đơn giản cho vấn đề của bạn.

Bạn đang cào HTML từ máy chủ và vì mã C# của bạn không phải là trình duyệt web thực, nó không thực thi các tập lệnh máy khách.

Bằng cách này bạn không thể truy cập thông tin mà HTML bạn tìm nạp không chứa.

Chỉnh sửa: Tôi không biết các cuộc gọi AJAX phức tạp từ trang web gốc như thế nào, nhưng bạn có thể sử dụng Firebug hoặc Fiddler cho IE để xem các yêu cầu được thực hiện như thế nào để gọi các cuộc gọi AJAX này C# ứng dụng quá. Vì vậy, bạn có thể thêm các mẩu thông tin bạn cần. Nhưng nó chỉ là một giải pháp lý thuyết.

+0

Tôi nghĩ như vậy, tiếc quá. Vì vậy, không có cách nào để tôi có được dữ liệu đó ... –

+0

Tôi đã chỉnh sửa câu hỏi của mình bằng giải pháp THEORETICAL ...nó phụ thuộc vào hoàn cảnh, tần suất các trang thay đổi ... – splattne

+0

Tôi kiểm tra dữ liệu sau mỗi 30 phút. Tôi nghĩ đó là những gì tôi sẽ phải làm, thật tiếc! –

5

Khi bạn mở một trang web trong trình duyệt web, đó là trình duyệt thực hiện javascript và tải xuống các tài nguyên bổ sung được trang sử dụng (hình ảnh, tập lệnh, v.v.). HttpWebRequest tự nó sẽ không làm bất kỳ điều này, nó sẽ chỉ tải xuống html cho trang bạn yêu cầu. Nó sẽ không bao giờ thực thi bất kỳ mã javascript/ajax nào trên chính nó.

3

HttpWebRequest không mô phỏng trình duyệt web, nó chỉ tải xuống tài nguyên bạn trỏ vào. Điều này có nghĩa là nó sẽ không thực hiện hoặc thậm chí tải xuống các tệp JavaScript.

Bạn sẽ phải sử dụng một cái gì đó như FireBug để lấy URL cho dữ liệu được lấy qua JavaScript và chỉ ra HttpWebRequest của bạn tại đó.

+0

Tôi nghĩ về điều đó nhưng nó không phải là một URL của nó một số và khi tôi sử dụng http yêu cầu nhãn mà số lượng là trên trống –

+0

Tôi đã có ý tưởng tương tự. Nhưng tôi đoán nó sẽ là một PITA để giữ cho rằng mã làm việc theo thời gian ... – splattne

+0

từ 30 phút tôi đã thử, làm theo cách này có vẻ không đơn giản chút nào. –

12

Chỉ cần một ý tưởng nhưng có một cách để có .net tải một trang web như thể nó là trong một trình duyệt: sử dụng System.Windows.Forms

bạn có thể Tải trang web thành một điều khiển WebBrowser

WebBrowser wb = new WebBrowser(); 
wb.ScrollBarsEnabled = false; 
wb.ScriptErrorsSuppressed = true; 
wb.Navigate(url); 
while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } 
wb.Document.DomDocument.ToString() 

Điều này có thể sẽ cung cấp cho bạn DOM trước ajax nhưng có thể có cách để cho phép chạy ajax trước.

+1

Tôi đã thử nó, và nó thực sự hoạt động. thanks –

+0

Bạn sẽ cần phải thêm một tham chiếu đến System.Windows.Forms để truy cập vào lớp WebBrowser (nếu nó chưa được tham chiếu trong dự án của bạn). – grasmi

+0

Ngoài ra, sau đây đã giúp nhận được một phiên bản luồng của giải pháp này làm việc. https://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread/4271581#4271581 – Jerrill

4

Sử dụng HttpWebRequest để tải xuống trang, tìm kiếm chương trình mã nguồn cho thông tin ajax có liên quan và sau đó sử dụng HttpWebRequest mới để kéo dữ liệu đó xuống.

1

Sử dụng HttpWebRequest để tải xuống trang. Tìm kiếm mã nguồn cho thông tin AJAX có liên quan và sau đó sử dụng HttpWebRequest mới để kéo dữ liệu đó xuống.

0

Bạn có thể sử dụng số PhantomJs. Tôi đã có số này Issue, nhưng không tìm thấy giải pháp cho vấn đề của tôi. Theo tôi, giải pháp tốt nhất là This.

Giải pháp của tôi là như thế này:

var page = require('webpage').create(); 

page.open("https://sample.com", function(){ 
    page.evaluate(function(){ 
     var i = 0, 
     oJson = jsonData, 
     sKey; 
     localStorage.clear(); 

     for (; sKey = Object.keys(oJson)[i]; i++) { 
      localStorage.setItem(sKey,oJson[sKey]) 
     } 
    }); 

    page.open("https://sample.com", function(){ 
     setTimeout(function(){ 
     page.render("screenshoot.png") 
      // Where you want to save it  
      console.log(page.content); //page source 
      // You can access its content using jQuery 
      var fbcomments = page.evaluate(function(){ 
       return $("body").contents().find(".content") 
      }) 
      phantom.exit(); 
     },10000) 
    });  
}); 
Các vấn đề liên quan