2011-08-22 42 views
5

Điều này có vẻ hơi lạc hậu, nhưng tôi muốn sử dụng Perl (và Curl nếu có thể) để lấy dữ liệu từ một trang web đang sử dụng Ajax để điền vào một trình bao HTML với thông tin. Làm cách nào để thực hiện các cuộc gọi Javascript này để nhận dữ liệu tôi cần?Làm cách nào để thu thập dữ liệu từ trang web sử dụng AJAX, với Perl?

Trang web này là ở đây: http://www.jigsaw.com/showContactUpdateTab.xhtml?companyId=224230

+1

Từ ToS của trang web: Hành động chống lại Trang web/Dịch vụ. Bạn không được cố gắng hoặc tham gia vào các hành vi có hại có hại chống lại Trang web hoặc Dịch vụ, bao gồm, nhưng không giới hạn, những điều sau đây: ... Sử dụng phần mềm, thiết bị, rô bốt hoặc các quy trình khác để truy cập, “scrape , "Thu thập dữ liệu" hoặc "nhện" bất kỳ trang nào có trong Trang web ... – Ashley

+1

@Ashley, cảm ơn bạn đã làm cho tôi biết về ToS của họ và tôi sẽ thông báo cho sếp của tôi. Ông/luật sư của ông sẽ đi đến một quyết định thích hợp dựa trên điều này.Nhưng như mọi khi, bài đăng này là đúng cho các mục đích giáo dục. –

+0

@Ashley Tôi đã thông báo cho cảnh sát Điều khoản dịch vụ của trang web, họ sắp bắt giữ áp phích. Sho: vẫn ở nơi bạn đang đứng và lấy tay ra khỏi bàn phím. – mikemaccana

Trả lời

4

Hãy nhớ rằng các cuộc gọi AJAX là các yêu cầu HTTP thông thường, vì vậy bạn nên luôn luôn có thể thực hiện chúng.

mở Firebug hoặc Web Inspector trên trang web bạn đang nói đến, bạn sẽ thấy một số XHR gọi:

XHR tải xong: "http://www.jigsaw.com/dwr/interface /UserActionAPI.js ". "http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getMostPurchasedContacts.dwr". "http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyGraveyardedContacts.dwr " http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyAddedContacts.dwr ". " http://www.jigsaw.com/dwr/call/plaincall/UserActionAPI.getRecentlyTitleChangedContacts.dwr"

Yay! Bây giờ bạn biết được nơi để có được dữ liệu đó. kịch bản của họ sử dụng POST yêu cầu HTTP đến các URL trên, vì vậy nếu bạn mở chúng trong trình duyệt của mình, bạn sẽ thấy nhiều lỗi động cơ khác nhau

Khi bạn sniff (thông qua trình gỡ lỗi Trình kiểm tra Web), bạn sẽ thấy nội dung tiếp theo:

"callCount = 1 page =/showContactUpdateTab.xhtml? CompanyId = 224.230 httpSessionId = F5E7EC4A45DFCE87B969A9F4FA06C361 scriptSessionId = D020EFF4333283B907402687182D03E034 c0-Tập lệnh = UserActionAPI c0-methodName = getRecentlyGraveyardedContacts c0-id = 0 c0- param0 = số: 224.230 c0-param1 = boolean: false c0-param2 = boolean: false Id lô = 1 "

Tôi khá chắc chắn, họ đang tạo ra một loạt các ID phiên bảo mật để tránh những người khai thác dữ liệu. Bạn có thể cần phải đi sâu vào mã JavaScript của họ để tìm hiểu thêm về những máy phát điện đó.

+0

Ngọt ngào! Tìm thấy các tham số trong Firebug và cắm chúng vào một cuộc gọi POST trong cURL. Cảm ơn! –

+0

Tôi không biết ... Tôi đã xóa hoàn toàn tập lệnhSessionID và httpSessionID và vẫn có thể nhận tất cả dữ liệu. Có thể họ thậm chí không theo dõi các ID đó? –

+0

Có khả năng là họ sử dụng các giá trị đó trong nội bộ (bằng JavaScript) so sánh ID đã gửi với những ID đã nhận, tức là theo dõi các phản hồi thích hợp cho các yêu cầu được lưu trữ. –

2

Một số ứng dụng có mã để kiểm tra xem máy khách có phải là một ứng dụng khách AJAX thực hay không. Họ chỉ đơn giản là kiểm tra sự hiện diện của tiêu đề X-Requested-With: XMLHttpRequest. Vì vậy, thật dễ dàng để phá vỡ:

curl -H 'X-Requested-With: XMLHttpRequest' ... 

use HTTP::Request::Common; 
GET $url, 'X-Requested-With' => 'XMLHttpRequest', ... 

Tất nhiên, bạn có thể phải đối phó với những thứ bình thường, giống như cookie cần thiết (đối với phiên), các thông số nonce, thỉnh thoảng phức tạp. Firebug hoặc tương tự cho các trình duyệt khác sẽ giúp bạn đảo ngược kỹ thuật các tiêu đề và thông số được yêu cầu.

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