Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   Перебор через URL + извлечение данных по странице (https://javascript.ru/forum/css-html-firefox-mizilla/65582-perebor-cherez-url-izvlechenie-dannykh-po-stranice.html)

quende 27.10.2016 16:17

Перебор через 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

Помогите, пожалуйста!
Спасибо!

Deff 28.10.2016 07:44

quende,
Нун выполнять синхронный запросы, ибо при таком колве, ассинхронные просто затыкаются после пяти одновременных запросов не дождавшихся ответов... При большом колве запросов у ассинхронного нет выигрыша по скорости... (если не требуется возможность юзать в это время по странице, кроме прерывания проги, при данном скачивании )

Имхо проще использовать готовый Аякс( к примеру от JQ) там и проще кроссбраузерно установить синхронность, ассинхронность... можно создать очередь ассинхронных запросов если необходима юзабельность сайта в это же время:
http://jquery-docs.ru/Ajax/jQuery.ajax/

Aetae 28.10.2016 08:18

Deff, ну не скажи. Быстрее таки держать десяток активных запросов если канал и сервак позволяет и по мере освобождения запускать следующий.

Deff 28.10.2016 08:26

Aetae,
Брауз запрещает более пяти активных запросов со страницы(хотя давно тестил, но менее трех месяцев, стоит База на JSON запросах на статистику дык коли ассинхронно - затыкаются эпизодически, нумерованный список воспроизводится с пропусками
=============
И да, мон слегка ускорить с ассинхронностью, запуская Пять одновременно, и каждый по возврату запускает новый запрос, элементы уже отправленых(если данные еще и отправляются из списка) - помечать

Но по тесту, синхронный тут жа возвращает через время задержки на приём/передачу
Ассинхронный может уже получить данные, но не отдавать скрипту, а прерываться на выполнение своих актуальных задач(замечено при много вкладок и открытии новых) сниффер на компе видет отдачу запроса, а скрипту данные могут поступать ток через секунду, наблюдал при открытии новых вкладок с Хабра, а скрипт с Аяксом на своем сайте во вкладке

Aetae 28.10.2016 15:36

Ну так то да, грабить большой сайт из браузера вообще не слишком разумно, не под то заточен. На крайняк можно нодой воспользоваться было. А зафейлиные запросы надо просто отслеживать и перезапускать.)

P.S. Количество подключений настраивается, я у себя подтюнил на-побольше, ибо канала не жалко, а прирост скорости местами есть.)

quende 31.10.2016 14:16

Друзья мои, спасибо, почему то не приходили отбивки об ответах, поэтому не видел, что отвечали)
Спасибо за подсказки, буду копать :)

Aetae 31.10.2016 14:58

quende, onerror и ontimeout повесить не забудь.)


Часовой пояс GMT +3, время: 19:50.