Usercript поможет запустить nextPage автоматизации в хроме для одного конкретного сайта [дубликат]

$result = $data1 . $data2;

попробуйте это

4
задан Brock Adams 12 November 2012 в 07:43
поделиться

1 ответ

Основными подходами для получения данных с страницы / сайта для mashup являются:

  1. Скремблирование через AJAX: это работает практически на всех страницах, хотя оно не будет работать со страницами, которые загружаются контент, который вы хотите использовать через AJAX. Иногда это может также оказаться сложным для сайтов, требующих проверки подлинности, или для ограничения ссылок. В большинстве случаев используйте GM_xmlhttpRequest() , чтобы разрешить междоменные скрипты.
  2. Загрузка страницы ресурса в <iframe>: этот подход работает на страницах с AJAX-кодом и может быть закодирован, чтобы позволить пользователю справляться с проблемами входа в систему вручную. Но это: медленнее, более ресурсоемкий и сложнее кодировать. Поскольку это не требуется для подробностей данного вопроса, см. «Как получить запрос на получение AJAX для ожидания отображения страницы перед возвратом ответа?» для получения дополнительной информации об этом .
  3. Используйте API-интерфейс сайта, если он имеет один: Увы, большинство сайтов не имеют API, поэтому, вероятно, это не вариант для вас, но стоит убедиться, что никакой API не является предложенный. API, как правило, лучший подход, если он доступен. Сделайте новый поиск / вопрос для получения дополнительной информации об этом подходе.
  4. Подражание вызовам AJAX сайта, если он делает такие вызовы для информации, которую вы хотите: эта опция также неприменима к большинству сайтов, но это может быть чистая, эффективная техника, когда она есть. Сделайте новый поиск / вопрос для получения дополнительной информации об этом подходе.

Извлечение значений из последовательности веб-страниц через AJAX с поддержкой перекрестных доменов:

Используйте GM_xmlhttpRequest() для загрузки страниц, а jQuery - для обработки их HTML. Используйте функцию GM_xmlhttpRequest() onload для вызова следующей страницы, если необходимо, не пытайтесь использовать синхронные вызовы AJAX.

Основная логика, начиная с вашего исходного сценария, перемещается в пределах onload - за исключением того, что больше не нужно запоминать значения между прогонами Greasemonkey.

Вот полный сценарий Greasemonkey с некоторым сообщением о статусе и ошибках:

// ==UserScript==
// @name        _Total-value mashup
// @include     https://play.google.com/apps*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant       GM_addStyle
// @grant       GM_xmlhttpRequest
// ==/UserScript==

var startNum        = 0;
var totalValue      = 0;

//--- Scrape the first account-page for item values:
$("body").prepend (
    '<div id="gm_statusBar">Fetching total value, please wait...</div>'
);
scrapeAccountPage ();

function scrapeAccountPage () {
    var accntPage   = 'https://play.google.com/store/account?start=0&num=40';
    accntPage       = accntPage.replace (/start=\d+/i, "start=" + startNum);

    $("#gm_statusBar").append (
        '<span class="gmStatStart">Fetching page ' + accntPage + '...</span>'
    );

    GM_xmlhttpRequest ( {
        method:     'GET',
        url:        accntPage,
        //--- getTotalValuesFromPage() also gets the next page, as appropriate.
        onload:     getTotalValuesFromPage,
        onabort:    reportAJAX_Error,
        onerror:    reportAJAX_Error,
        ontimeout:  reportAJAX_Error
    } );
}

function getTotalValuesFromPage (respObject) {
    if (respObject.status != 200  &&  respObject.status != 304) {
        reportAJAX_Error (respObject);
        return;
    }

    $("#gm_statusBar").append ('<span class="gmStatFinish">done.</span>');

    var respDoc     = $(respObject.responseText);
    var targetElems = respDoc.find ("#tab-body-account .rap-link");

    targetElems.each ( function () {
        var itmVal  = $(this).attr ("data-docprice").replace (/[^\d\.]/g, "");
        if (itmVal) {
            itmVal   = parseFloat (itmVal);
            if (typeof itmVal === "number") {
                totalValue += itmVal;
            }
        }
    } );
    console.log ("totalValue: ", totalValue.toFixed(2) );

    if ( respDoc.find (".snippet.snippet-tiny").length ) {
        startNum       += 40;
        //--- Scrape the next page.
        scrapeAccountPage ();
    }
    else {
        //--- All done!  report the total.
        $("#gm_statusBar").empty ().append (
            'Combined Value: $' + totalValue.toFixed(2)
        );
    }
}

function reportAJAX_Error (respObject) {
    $("#gm_statusBar").append (
        '<span class="gmStatError">Error ' + respObject.status + '! &nbsp; '
        + '"' + respObject.statusText + '" &nbsp; &nbsp;'
        + 'Total value, so far, was: ' + totalValue
        + '</span>'
    );
}

//--- Make it look "purty".
GM_addStyle ( multilineStr ( function () {/*!
    #gm_statusBar {
        margin:         0;
        padding:        1.2ex;
        font-family:    trebuchet ms,arial,sans-serif;
        font-size:      18px;
        border:         3px double gray;
        border-radius:  1ex;
        box-shadow:     1ex 1ex 1ex gray;
        color:          black;
        background:     lightgoldenrodyellow;
    }
    #gm_statusBar .gmStatStart {
        font-size:      0.5em;
        margin-left:    3em;
    }
    #gm_statusBar .gmStatFinish {
        font-size:      0.5em;
        background:     lime;
    }
    #gm_statusBar .gmStatError {
        background:     red;
        white-space:    nowrap;
    }
*/} ) );

function multilineStr (dummyFunc) {
    var str = dummyFunc.toString ();
    str     = str.replace (/^[^\/]+\/\*!?/, '') // Strip function() { /*!
            .replace (/\s*\*\/\s*\}\s*$/, '')   // Strip */ }
            .replace (/\/\/.+$/gm, '') // Double-slash comments wreck CSS. Strip them.
            ;
    return str;
}


Важно: не забудьте директивы @include, @exclude и / или @match, поэтому ваш скрипт не запускается на каждой странице и iframe!

9
ответ дан Community 21 August 2018 в 03:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: