2012-04-27 41 views
5

tôi có một tập lệnh (bên dưới) để xóa một trang web với quy trình 3 bước. nó hoạt động tốt khi được đặt tối đa 1 trang tại một thời điểm. tuy nhiên, khi tôi tăng lên 2 lần vào thời điểm mọi thứ bắt đầu trở nên ảm đạm. đám cháy onFinished sớm hơn tôi mong đợi và trang chưa được tải hoàn toàn. vì điều này phần còn lại của kịch bản của tôi bị phá vỡ. bất kỳ ý tưởng tại sao điều này có thể xảy ra? tôi nên thêm rằng tôi đang sử dụng phiên bản mới nhất (1.5).Hành vi tải không mong muốn PhantomJS với nhiều trang

MAX_PAGES = 1 
### 
changing MAX_PAGES to >1 causes some pages onFinished event to fire before 
the page is fully rendered. this is evident by the fact that there are >1 images 
for some pages. i havent been able to reproduce using microsoft.com, but on some 
pages i was working on the first onLoadFinished seemed to be called before the page 
was actually fully loaded based on the look of the rendered images 
### 

newPage = (id) -> 
context = {} 
context.id = id 
context.step = 0 
context.page = require('webpage').create() 
context.page.onLoadStarted = -> 
    context.step++ 
context.page.onLoadFinished = (status) -> 
    console.log status 
    if status is 'success' 
     context.page.render("#{context.id}_#{context.step}.png") 
    else 
     context.page.release() 
     context.page.open('http://www.microsoft.com') 
     console.log 'started loading' 

newPage id for id in [1..MAX_PAGES] 

Trả lời

4

Tôi nghĩ rằng vấn đề đã làm với thực tế là mỗi trang web trong vòng PhantomJS được sử dụng cùng một QNetworkAccessManager, do đó, tín hiệu finished() được bắn khi từng đối tượng trang web tải xong. Các sửa đổi đối với mã của PhantomJS có thể cần phải được thực hiện để khắc phục sự cố này. Tôi đã nhận thấy điều này trước khi cố gắng tải nhiều trang song song trong PhantomJS. Một ứng dụng tôi đang làm việc trên sử dụng QtWebkit và tải nhiều trang đồng thời vì vậy tôi phải đảm bảo rằng mỗi trang web đều có QNetworkAccessManager riêng của mình để các tín hiệu hoàn thành() không can thiệp lẫn nhau.

3

Để thu thập dữ liệu nhiều trang, hãy xem ví dụ follow.js đi kèm với thư viện. https://github.com/ariya/phantomjs/blob/master/examples/follow.js

Bạn cần phải sử dụng đệ quy để đợi trang hiện tại tải trước khi tải trang tiếp theo.

+0

Nếu không phải là một cuộc gọi đệ quy như trong ví dụ này, ít nhất một cuộc gọi lại sẽ kích hoạt thu thập thông tin tiếp theo. –

+0

Liên kết của bạn bị hỏng :( – Julien

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