2014-10-21 13 views
7

Tôi nhấp vào liên kết trong Firefox, trang web sẽ gửi yêu cầu bằng javascript, sau đó máy chủ gửi một số loại phản hồi bao gồm địa chỉ trang web. Vì vậy, trang web mới này sau đó sẽ mở ra trong một cửa sổ mới. Mã html đằng sau liên kết là (Tôi đã bỏ qua ban đầu và cuối cùng <span> tag):Chụp phản hồi AJAX với selen và python

> class="taLnk hvrIE6" 
> onclick="ta.trackEventOnPage('AttractionContactInfo', 'Website', 
> 2316062, 1); ta.util.cookie.setPIDCookie(15190); 
> ta.call('ta.util.link.targetBlank', event, this, 
> {'aHref':'LqMWJQiMnYQQoqnQQxGEcQQoqnQQWJQzZYUWJQpEcYGII26XombQQoqnQQQQoqnqgoqnQQQQoqnQQQQoqnQQQQoqnqgoqnQQQQoqnQQuuuQQoqnQQQQoqnxioqnQQQQoqnQQJMsVCIpEVMSsVEtHJcSQQoqnQQQQoqnxioqnQQQQoqnQQniaQQoqnQQQQoqnqgoqnQQQQoqnQQWJQzhYmkXHJUokUHnmKTnJXB', 
> 'isAsdf':true})">Website 

Tôi muốn nắm bắt được phản ứng máy chủ và trích xuất các 'trang web mới' bằng Python và Selenium. Tôi đã sử dụng BeautifulSoup để cạo và khá mới mẻ với Selenium.

Cho đến giờ, tôi có thể tìm thấy phần tử này và nhấp vào nó bằng selen, mở ra 'trang web mới' trong một cửa sổ mới. Tôi không biết cách nắm bắt phản hồi từ máy chủ.

+0

Tôi nghĩ rằng tiêu đề của câu hỏi là gây hiểu nhầm - beautifulsoup không liên quan gì đến câu hỏi của bạn. "có được phản ứng AJAX bằng cách sử dụng Selenium" hoặc một cái gì đó có liên quan. – SiddharthaRT

+0

Một thành viên cao cấp đề nghị tôi đổi tên câu hỏi của tôi theo cách này ... tiêu đề thực sự của tôi thực sự liên quan đến python và selenium – Faisal

Trả lời

1

tôi đã không thể nắm bắt được AJAX phản ứng với selen nhưng đây là những gì hoạt động, mặc dù không selen:

1- Tìm hiểu yêu cầu XML bằng cách giám sát các công cụ phân tích mạng trong trình duyệt của bạn

2 = Khi bạn đã xác định yêu cầu, hãy tạo lại yêu cầu bằng các yêu cầu của Python hoặc các mô-đun urllib2. Cá nhân tôi đề nghị yêu cầu vì các tính năng bổ sung của nó, quan trọng nhất đối với tôi là requests.Session.

Bạn có thể tìm thấy nhiều trợ giúp và bài đăng liên quan về hai bước này.

Hy vọng nó sẽ giúp ai đó một ngày nào đó.

+0

Đã làm chính xác điều này cho một trang web tôi đang cạo.Mất một lúc để tìm ra lời gọi thực sự từ các công cụ mạng của Chrome nhưng tôi đã tìm thấy nó. Sau đó, tôi đã thử nghiệm phản hồi trong trình duyệt của mình và cuối cùng là các yêu cầu. Làm việc như người ở. Trong trường hợp của tôi, đầu ra dường như là một kết hợp của JSON và dữ liệu khác - tất cả đều được phân tích cú pháp dễ dàng. Cảm ơn một lần nữa. –

+0

Vui vì tôi có thể giúp. – Faisal

8

Tôi đã từng chặn một số cuộc gọi ajax đưa javascript vào trang bằng selenium. Mặt xấu của lịch sử là selen đôi khi có thể là, hãy nói "mong manh". Vì vậy, không có lý do gì tôi có ngoại lệ selenium trong khi thực hiện tiêm này.

Dù sao, ý tưởng của tôi đã chặn các cuộc gọi XHR và đặt phản hồi của nó thành phần tử dom mới do tôi tạo ra để tôi có thể thao tác từ selen. Trong điều kiện để đánh chặn thậm chí bạn có thể sử dụng các url mà thực hiện các yêu cầu để chỉ chặn một trong đó bạn thực sự muốn (self._url)

btw, tôi đã có ý tưởng từ intercept all ajax calls?

Có lẽ đây giúp.

browser.execute_script(""" 
(function(XHR) { 
    "use strict"; 

    var element = document.createElement('div'); 
    element.id = "interceptedResponse"; 
    element.appendChild(document.createTextNode("")); 
    document.body.appendChild(element); 

    var open = XHR.prototype.open; 
    var send = XHR.prototype.send; 

    XHR.prototype.open = function(method, url, async, user, pass) { 
    this._url = url; // want to track the url requested 
    open.call(this, method, url, async, user, pass); 
    }; 

    XHR.prototype.send = function(data) { 
    var self = this; 
    var oldOnReadyStateChange; 
    var url = this._url; 

    function onReadyStateChange() { 
     if(self.status === 200 && self.readyState == 4 /* complete */) { 
     document.getElementById("interceptedResponse").innerHTML += 
      '{"data":' + self.responseText + '}*****'; 
     } 
     if(oldOnReadyStateChange) { 
     oldOnReadyStateChange(); 
     } 
    } 

    if(this.addEventListener) { 
     this.addEventListener("readystatechange", onReadyStateChange, 
     false); 
    } else { 
     oldOnReadyStateChange = this.onreadystatechange; 
     this.onreadystatechange = onReadyStateChange; 
    } 
    send.call(this, data); 
    } 
})(XMLHttpRequest); 
""") 
+0

Cảm ơn bạn đã chia sẻ kinh nghiệm của mình. Tôi không có kiến ​​thức về javascript. Tôi chỉ cần thu thập một số dữ liệu mà trang web đã gửi dưới dạng phản hồi của cuộc gọi ajax. Giải pháp dường như xác định và mô phỏng cuộc gọi bằng cách sử dụng các mô-đun riêng của Python như yêu cầu hoặc urllib. Điều này giúp tôi thu thập dữ liệu mà không cần bất kỳ nội dung javascript nào – Faisal

+0

Nếu bạn biết url của trang web trước, bạn không cần phải xử lý javascript, nhưng trong trường hợp của tôi, không dễ để biết trước một số thông số của url, vì vậy tôi cần phải đối phó với js. Nếu giải pháp của vấn đề của bạn là những gì bạn đã đăng trước đó, vui lòng đánh dấu nó là câu trả lời cho câu hỏi của bạn. – supita

+0

Gần hai năm sau, đây vẫn là con đường để đi? Tôi cần phải lấy các url của ajax gọi trang web của tôi làm cho, như tôi không biết một số các thông số trước. Ngoài ra, những gì về thời gian? Làm thế nào tôi có thể chắc chắn, rằng kịch bản này được thực hiện trước khi bất kỳ yêu cầu ajax xảy ra? Cám ơn. – Hinrich

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