दुःस्वप्न काम कर रहा है, निश्चित रूप से मैं इस उपकरण का परीक्षण कर रहा हूं, लेकिन मुख्य रूप से समस्या यह है कि मेरा कार्य अनंत लूप पर क्यों नहीं है? चूंकि मैंने पेज के लिए कोई शर्त नहीं रखी थी। क्या मैं यह गलत कर रहा हूँ?

जो मामला मैं चाहता था वह था: जब भी पेज लोड होता है, तो मुझे पेज के साथ टिटल मिलता है, फिर फंक्शन को फिर से अगले पेज पर आखिरी पेज तक कॉल करें।

मैंने सफलता के बिना सेटटाइमआउट भी कोशिश की। क्या कोई मेरी मदद कर सकता है? अग्रिम धन्यवाद।

मेरा कंसोल लॉग बस 1 प्रिंट करें और फिर समाप्त करें।

कोड स्निपेट यहाँ है: -

var pagn = 1;
function ab(page){
    nightmare.goto(url_base+"&page="+page)
             .evaluate(() => {
                return document.title;
            })
            .end()
            .then((title) => {
                console.log(title + ":" + page);
                ab(++pagn);
                //setTimeout("page(" + page + ")", 5000);
            }).catch(()=>{console.log("Error");});
}
ab(pagn);
0
Marks 28 मार्च 2018, 09:17

3 जवाब

सबसे बढ़िया उत्तर

समस्या यह है कि आप अपना सत्र को समाप्त कर रहे हैं .end() कथन, जो दुःस्वप्न इंजन को रोकता है, और इसलिए शेष .then कथनों के माध्यम से चलने के बाद नोड बाहर निकलता है।

आपके कोड का परीक्षण करने के लिए, मैं आपके फ़ंक्शन को थोड़ा सा फिर से लिखता हूं, ताकि यह किसी विशेष वेबसाइट को स्क्रैप कर दे, और एक ही पृष्ठ को कई बार मिलने पर बाहर निकल जाए (जो कि मेरा परीक्षण परिदृश्य है, इसलिए आपको इसे अपने कोड के लिए अनुकूलित करना पड़ सकता है)

const Nightmare = require('nightmare')
const nightmare = Nightmare({ show: true })

function scrapePages( targetUrl, curPage = 0, transform = (url, page) => `${url}?page=${page}`, pageSet = new Set() ) {
    console.info('Trying to scrape page ' + transform( targetUrl, curPage ) );
    return nightmare
        .goto( transform( targetUrl, curPage ) )
        .evaluate( () => document.title )
        .then( (title) => {
            if (pageSet.has( title )) {
            throw 'page already exists';
            }
            pageSet.add( title );
            console.info( title + ':' + curPage );
            return scrapePages( targetUrl, curPage + 1, transform, pageSet );
        })
        .catch( ( err ) => {
            console.error( err );
            return { maxPages: curPage, pages: pageSet };
        } );
}

scrapePages( 'some-paged-url', 0, (url, page) => url + '/' + (page + 1) )
    .then( ({ maxPages, pages }) => {
        // end nightmare process
        nightmare.end().then( () => {
            console.info(`Found ${maxPages} pages`);
        });
    } )
    .catch( err => console.error('Error occured', err ) );

जैसा कि आप देख सकते हैं, सबसे बड़ा अंतर यह है कि दुःस्वप्न प्रक्रिया का अंत केवल एक बार स्क्रैपिंग के बाद होता है। उस समय, आपके पास कुल पृष्ठ उपलब्ध होंगे और सभी पृष्ठ जिन्हें सफलतापूर्वक बुलाया गया था

0
Icepickle 28 मार्च 2018, 11:56

वैश्विक चर को परिभाषित करते समय आपको पृष्ठ चर को पास नहीं करना चाहिए अन्यथा इसे हर बार अधिलेखित कर दिया जाएगा ..

var page = 1;
function ab(){
    nightmare.goto(url_base+"&page="+page)
         .evaluate(() => {
            return document.title;
        })
        .end()
        .then((title) => {
            console.log(title + ":" + page);
            ab(page++);
            //setTimeout("page(" + page + ")", 5000);
        }); 
}

ab();
0
AZ_ 28 मार्च 2018, 06:38

क्या होगा यदि दुःस्वप्न द्वारा फेंका गया अस्वीकार है। गोटो ()। आपको कैच () लागू करना चाहिए page++ ने इंक्रीमेंटेड वैल्यू को इसके पोस्ट इंक्रीमेंट ऑपरेटर के रूप में पास नहीं किया। page + 1 या ++page को चालें चलनी चाहिए।

var page = 1;
function ab(page){
    nightmare.goto(url_base+"&page="+page)
            .evaluate(() => {
                return document.title;
                    })
            .end()
            .then((title) => {
                console.log(title + ":" + page);
                ab(page+1);
                //setTimeout("page(" + page + ")", 5000);
            }).catch(error => {
                console.error('Search failed:', error)
                ab(page);
            }); 
    }

ab(page);
0
atiq1589 28 मार्च 2018, 06:42