Перебор через URL + извлечение данных по странице
Друзья мои, приветствую!
Совсем недавно начал работать с JS и возникло несколько вопросов. В частности, нужно решить вот какую задачу: Есть страницы с определенными URL: http://www.transfermarkt.co.uk/en/z/kader/verein/{i}, где {i} - переменная часть = значения от 1 до 56000. я уже нашел нужные части на странице и даже достал их, но встал вопрос как их получить в осязаемый вид (csv, txt или xls). Вот то, что мне удалось написать: window.Arr = '';/*я сделал через строку, но можно попробовать и через массив*/ for(i=1;i<=10;i++){ /* здесь пока указал 10, но нужно указать 56000*/ var http = new XMLHttpRequest(); http.open('GET', 'http://www.transfermarkt.co.uk/en/z/kader/verein/'+i); http.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { var doc = new DOMParser().parseFromString(this.responseText, "text/html"); var Cou = doc.getElementsByClassName('flaggenrahmen')[0].title; var Team = doc.getElementsByClassName('dataName')[0].innerHTML; var CouNum = doc.getElementById('land_select_breadcrumb')[0].value; Team = Team.replace('\n <h1 itemprop="name">\n <b>',''); Team = Team.replace('</b>\n </h1>',''); Team = Team.replace("</h1>",""); window.Arr += "[" + CouNum + "]" + Cou + "|" + Team + "\r\n"; /*можно сделать и через массив*/ } } http.send(null); } заметил по логам, что не все данные сохраняются, по всей видимости, он не "успевает" забирать данные со всех страниц. Получается этот способ не такой уж и действенный, быть может вы подскажите "правильный" и более приемлемый способ по решению такой задачи ? Кроме того, получившийся результат нужно сохранить в csv или xls Помогите, пожалуйста! Спасибо! |
quende,
Нун выполнять синхронный запросы, ибо при таком колве, ассинхронные просто затыкаются после пяти одновременных запросов не дождавшихся ответов... При большом колве запросов у ассинхронного нет выигрыша по скорости... (если не требуется возможность юзать в это время по странице, кроме прерывания проги, при данном скачивании ) Имхо проще использовать готовый Аякс( к примеру от JQ) там и проще кроссбраузерно установить синхронность, ассинхронность... можно создать очередь ассинхронных запросов если необходима юзабельность сайта в это же время: http://jquery-docs.ru/Ajax/jQuery.ajax/ |
Deff, ну не скажи. Быстрее таки держать десяток активных запросов если канал и сервак позволяет и по мере освобождения запускать следующий.
|
Aetae,
Брауз запрещает более пяти активных запросов со страницы(хотя давно тестил, но менее трех месяцев, стоит База на JSON запросах на статистику дык коли ассинхронно - затыкаются эпизодически, нумерованный список воспроизводится с пропусками ============= И да, мон слегка ускорить с ассинхронностью, запуская Пять одновременно, и каждый по возврату запускает новый запрос, элементы уже отправленых(если данные еще и отправляются из списка) - помечать Но по тесту, синхронный тут жа возвращает через время задержки на приём/передачу Ассинхронный может уже получить данные, но не отдавать скрипту, а прерываться на выполнение своих актуальных задач(замечено при много вкладок и открытии новых) сниффер на компе видет отдачу запроса, а скрипту данные могут поступать ток через секунду, наблюдал при открытии новых вкладок с Хабра, а скрипт с Аяксом на своем сайте во вкладке |
Ну так то да, грабить большой сайт из браузера вообще не слишком разумно, не под то заточен. На крайняк можно нодой воспользоваться было. А зафейлиные запросы надо просто отслеживать и перезапускать.)
P.S. Количество подключений настраивается, я у себя подтюнил на-побольше, ибо канала не жалко, а прирост скорости местами есть.) |
Друзья мои, спасибо, почему то не приходили отбивки об ответах, поэтому не видел, что отвечали)
Спасибо за подсказки, буду копать :) |
quende, onerror и ontimeout повесить не забудь.)
|
Часовой пояс GMT +3, время: 09:37. |