zapętlanie zapytania xhr?

0

Od razu na wstępie powiem, że nie jestem informatykiem, lecz humanistą (dokładniej mówiąc historykiem).
Potrzebuję pobrać dane z jednej ruskiej bazy danych https://www.obd-memorial.ru. Problem w tym, że danych tych jest 20 milionów rekordów (z czego id rekordów mają nawet po 10-11 cyfr, gdyż nie wszystkie są po kolei), a maksymalnie po 1 zapytaniu można zwrócić niecałe 10 tysięcy rekordów.
Mam taki skrypt wywoływany przez konsolę:

var request = require("request");

var options = { method: 'POST',
  url: 'http://obd-memorial.ru/Image2/newsearchservlet',
  headers: 
   { 'content-type': 'application/x-www-form-urlencoded',
     'cache-control': 'no-cache' },
  form: 
   { foo: '0.6340119550004601',
     appName: 'Mem',
     group: '',
     xmlParam: '<request maxNumRecords="9700" firstRecordPosition="0" adjustPage="true"><record entity="Человек Донесение" fullTextField="{query}"/><record entity="Человек Госпиталь" fullTextField="{query}"/><record entity="Человек Дополнительное Донесение" fullTextField="{query}"/><record entity="Человек Захоронение" fullTextField="{query}"/><record entity="Человек Эксгумация" fullTextField="{query}"/><record entity="Человек Плен" fullTextField="{query}"/><record entity="Человек Приказ" fullTextField="{query}"/><record entity="Человек Картотека" fullTextField="{query}"/></request>' 
	 } 
};
options.form.xmlParam = options.form.xmlParam.replace(/\{query\}/g, '10000*');
console.log(options.form.xmlParam);
request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Wysłane zapytanie zwraca mi 9700 wyników w mniej więcej takiej formie:

<record id="2010409" entity="Человек Донесение" f2="Кошлаков" f3="Василий" f4="Моисеевич" f5="__.__.1922" f6="Курская обл., Черемисиновский р-н, дер. Покровка" f7="Суджанский РВК, Курская обл., Суджанский р-н" f8_old="67 морская стрелк. бр." f9_old="красноармеец" f11="убит" f12="16.06.1942" f14="Карело-Финская ССР, квадрат 72-12. А, карта 1:100000, издание 1936 г. лист 0-36-78 Пингосальма, Кестеньгское направлениекарта 1:100000, издание 1936 г. лист 0-36-78 Пингосальма, Кестеньгское направление" f18="ЦАМО" f19="58" f20="818883" f21="1383" f9="красноармеец" f8="67 морсбр" recordNumber="1" />

Moje pytanie teraz jest takie: w jaki sposób mogę zapętlić to zapytanie, żeby za każdym razem zmieniał się parametr zapytania czyli: 10000*. Myślę, że to co muszę zrobić to po prostu wysłać 100 tysięcy razy zapytanie zmieniając za każdym razem automatycznie parametr o jeden, czyli 10000*, 10001*, 10002* itd. No i najlepiej by było aby zapytanie było wysyłane co jakąś tam część sekundy, tak by mnie za szybko ruscy nie zbanowali.
W bazie tej znajduje się według szacunków ponad 100 tysięcy Polaków, którzy zginęli na wojnie lub siłą byli wciągnięci do Armii Czerwonej, a niestety poprzez samą przeglądarkę nie idzie ich wszystkich znaleźć.

No i proszę o opinię czy to w ogóle ma sens robienie tego w taki sposób.
Za wszelkie pomysły oraz pomoc będę bardzo wdzięczny, tylko proszę pisać do mnie prostym językiem, gdyż pojęcia o programowaniu za dużego to ja nie mam.

0

Ad komentarza: ale Ty wszystko pakujesz do ramu, a nie na dysk - chyba że gdzieś dalej to przerzucasz, wtedy ok.

0

No nie wiem ile trzeba mieć ramu :) mam 4 gb. Jeśli się tak nie uda jak planuję, to będę musiał po prostu poradzić się kogoś i przerobić mocno ten skrypt. Po prostu planuję zrobić go tak, że mi będzie zapisywał te rzeczy do bazy danych. Więc nie wiem czy dalej ram jest potrzebny. Chciałbym to ustawić, by co zapytanie pierw wrzucał do bazy danych ściągnięte rekordy i od nowa pytał o kolejne 9700. Pytanie tylko jak go zapętlić.

0

A ewentualnie zna ktoś jakąś komendę, by oszukać serwer. Mianowicie chodzi mi o to, że skopiowałem kilka tysięcy razy podany kod zmieniając za pomocą szukaj/zamień parametr. Problem jest tylko taki, że zgłasza mi je na raz, a nie po kolei wysyła i ściąga. A gdy tak robi, to po prostu po chwili serwer mnie odrzuca, gdyż ma ograniczony czas połączenia. Może przynajmniej da się przerobić ten skrypt tak, by po kolei je wysyłał, pomimo, że są w jednym pliku?

0

Jezusie słodki - poczytaj o pętlach, a nie kopiuj kod setki razy.
Jeśli kiedykolwiek programując będziesz musiał wykorzystać kopiuj/wklej - robisz coś źle.

Twoje podejście nie działa, ponieważ zapewne wykonujesz tysiące żądań w jednej sekundzie, co nie ma prawa się powieść - powinieneś wykonywać jedno po drugim.

0

A nie możesz użyć jakiegoś normalnego języka programowania typu Python i pobierać to chunkami?

0

Programowania się uczyłem 15 lat temu jako dzieciak w Pascalu. Od tamtej pory sporo się zmieniło i nie bardzo mam czas na naukę programowania, gdyż nie jest to mój zawód.
Zapytanie takie, ściągnąłem z Firebuga, wrzuciłem jako skrypt i ładnie ściąga pojedyncze zapytania. Pisałem w pierwszym poście, że nie bardzo mam o tym pojęcie i prosiłem o jakieś podpowiedzi lub doradzenie jak to zrobić. Po prostu myślałem, że może uda się to zrobić samemu lub z pomocą użytkowników forum, ale chyba po prostu poradzę się jakiegoś znajomego informatyka.

0

Rzuciłem Ci podpowiedź: wykorzystaj pętlę ;-)

A dokładniej: opakuj to swoje wywołanie w funkcję downloadChunk(chunkId) i potem w pętli wywołuj właśnie to downloadChunk z odpowiednim parametrem - nie zapomnij jednak o tym, że musi to być robione synchronicznie, a nie asynchronicznie (tak jak domyślnie).

function downloadChunk(chunkId) {
  // tutaj ta cała ajaxowa magia
}

for (var chunkId = 0; chunkId < 100000; chunkId += 1000) {
  downloadChunk(chunkId);
}
0

A jeśli można jaśniej jak ustawić ten tryb synchronicznie?
Udało mi się wpleść to zapytanie w pętle i ustawiłem, że ma powtarzać zapytanie tyle razy, aż dojdzie do zapytania z liczbą ponad miliard co tysiaka. O dziwo wszystko ładnie hula i mogę mu wrzucić nawet 1000 zapytań na raz i ładnie mi je zwraca (już nie wywala, że timeout itp.), tylko potrzebuję zrobić jednak by wrzucał zapytanie i gdy da odpowiedź dopiero kolejne. Tak jak w komentarzu było już napisane, potrzebuję zrobić by każde zapytanie od razu zapisywał, a nie trzymał je w pamięci. Próbowałem czytać po necie o tym wysyłaniu synchronicznym i asynchronicznym i wszędzie każą instalować jakieś dodatkowe biblioteki, a mi to nie bardzo wychodzi. Może da się jakimś parametrem albo poleceniem to ustawić.
Wiem, że dla Was to są rzeczy śmieszne i banalne, ale nie każdy się na tym zna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1