Сканер Node JS: Сканирование веб-страницы потока водопада HD-изображение

Node.js рептилия JavaScript PhantomJS

Оригинальная ссылка:Сканер Node JS: Сканирование веб-страницы потока водопада HD-изображение

Статические веб-страницы часто используют метод get для получения всего содержимого страницы. Динамические веб-страницы, то есть веб-страницы, запрашивающие данные асинхронно, должны быть загружены браузером перед сканированием. В этой статье описывается, как непрерывно сканировать каскадные веб-страницы.

упоминается в чжихуpythonДолжна быть большая группа людей, которые упоминают рептилий, давайтеNode JSКраулер тоже очень простой, иpythonСравнение — это просто сравнение производительности «асинхронного» и «многопоточного». правильноpythonЯ мало в этом разбираюсь, поэтому комментировать не буду.

phantomjsявляется «бескорпусным»chrome, проверьте конкретный метод установкиphantomjs.org.phantomjsПредоставьте инструменты командной строки для запуска, вам нужно использовать команду для запускаphantom xxx.js. использоватьphantom-nodeЭту библиотеку можно найти вNode Jsиграть вphantomjs, так что вы можете использоватьpm2Демон процесса и балансировка нагрузки.

Цель

Просканировать более 2001920*1080разрешение аниме обои, веб-страницыФото водопада Байду

image

Способ

Поток водопада основан на положении прокрутки страницы, чтобы определить, следует ли продолжать загрузку, поэтому необходимо использоватьphantomjsПрокрутите страницу, чтобы увидеть больше ссылок на изображения. Страница сведений об одном изображении представляет собой сжатое изображение при первом входе. Это мера Baidu для оптимизации скорости доступа. Через несколько секунд изображение src будет заменено ссылкой на изображение большего размера. Таким образом, при входе на страницу сведений об изображении вы должны задержаться на несколько секунд перед получением источника изображения. Конкретная задержка зависит от скорости вашей сети.

шаг

получить ссылку

Сначала используйте фантом, чтобы открыть веб-страницу

const phantom = require('phantom')

(async function() {
    const instance = await phantom.create();
    const page = await instance.createPage();
    const status = await page.open(url);
    const size = await page.property('viewportSize', {
        width: 1920,
        height: 1080
    })
}())

Получить количество ссылок, прокрутить страницу, если меньше 200

// 添加一个延时函数,等待页面加载后再滚动
function delay(second) {
    return new Promise((resolve) => {
        setTimeout(resolve, second * 1000);
    });
}
async function pageScroll(i) {
    await delay(5)
    await page.property('scrollPosition', {
        left: 0,
        top: 1000 * i
    })
    let content = await page.property('content')
    let $ = cheerio.load(content)
    console.log($('.imgbox').length)
    if($('.imgbox').length < 200) {
        await pageScroll(++i)
    }
}
await pageScroll(0)

Извлечь ссылку на изображение

let urlList = []
$('.imgbox').each(function() {
    urlList.push('https://image.baidu.com'+$(this).find('a').attr('href'))
})

сохранить изображение

Определите функцию для сохранения изображения

const request = require('request')
const fs = require('fs')

function save(url) {
    let ext = url.split('.').pop()
    request(url).pipe(fs.createWriteStream(`./image/${new Date().getTime()}.${ext}`));
}

траверсurlList, рекомендуется использовать рекурсивный обход, циклический обходdelayне работает

async function imgSave(i) {
    let page = await page.open(urlList[i])
    delay(1)
    let content = await page.property('content')
    $ = cheerio.load(content)
    let src = $('#currentImg').attr('src')
    save(src)
    if(i<urlList.length) {
        await imgSave(++i)
    }
}
await imgSave(0)

Окончательные результаты сканирования показаны на рисунке, все они имеют высокое разрешение, а некоторые изображения были защищены от сканирования.

image

полный код

const phantom = require('phantom')
const cheerio = require('cheerio')
const request = require('request')
const fs = require('fs')
function delay(second) {
    return new Promise((resolve) => {
        setTimeout(resolve, second * 1000);
    });
}
let url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&oq=%E5%8A%A8%E6%BC%AB+%E5%A3%81%E7%BA%B8&rsp=-1'
function save(url) {
    let ext = url.split('.').pop()
    request(url).pipe(fs.createWriteStream(`./image/${new Date().getTime()}.${ext}`));
}
(async function() {
    let instance = await phantom.create();
    let page = await instance.createPage();
    let status = await page.open(url);
    let size = await page.property('viewportSize', {
        width: 1920,
        height: 1080
    })
    let $
    async function pageScroll(i) {
        await delay(1)
        await page.property('scrollPosition', {
            left: 0,
            top: 1000 * i
        })
        let content = await page.property('content')
        $ = cheerio.load(content)
        if($('.imgbox').length < 200) {
            await pageScroll(++i)
        }
    }
    await pageScroll(0)
    let urlList = []
    $('.imgbox').each(function() {
        urlList.push('https://image.baidu.com'+$(this).find('a').attr('href'))
    })
    async function imgSave(i) {
        let status = await page.open(urlList[i])
        await delay(1)
        let content = await page.property('content')
        $ = cheerio.load(content)
        let src = $('#currentImg').attr('src')
        save(src)
        if(i<urlList.length) {
            await imgSave(++i)
        }
    }
    await imgSave(0)
    await instance.exit()
}());

мой блог:www.bougieblog.cn, добро пожаловать в чат.