Wpis z mikrobloga

Mirki, tak się zastanawiam. Napisałem crawler w #pythonie, strony z ogłoszeniami,
1.wchodzi mi na listę
2.zbiera paginacje
3.chodzi po paginacji
4.wchodzi na ogorzenia
5. zbiera info i zapisuje do bazy

Generalnie takie główne kroki. Skrypt wykonuje zapis ok.5 ogłoszeń na sekundę.

I teraz moje pytanie jak by sobie poradził php7, ma ktoś jakieś linki do benchmarków czy czegoś takiego? ew. jakieś pomysły jak zoptymalizować kod?


#programowanie #php #php7 #pytaniedoeksperta
  • 17
@destyl: pisałem ostatnio pythonowego crawlera, i najwolniejsze okazało się samo oczekiwanie na odpowiedź serwera. Przyspieszyłem sprawę robiąc tak:
1. Pobieram listę ogłoszeń (czyli otwieram listing, przelatuję po stronach i dodaję do kolekcji urle do stron do scrapowania) - to działo się jednowątkowo.
2. Tworzę n wątków (n dobrałem doświadczalnie) których zadaniem jest wzięcie pierwszego urla z kolekcji, skasowanie go z tej kolekcji, a potem pobranie zawartości i wrzucenie do bazy -
@destyl: jakie porty? Jak nie będziesz wysyłał zapytań z różnych adresów, to od razu widać, że to ten sam user. Zresztą nawet jak będziesz miał kilka, to łatwo je powiązać ze sobą jak będziesz naparzał 100+ requestów na sekundę.
@kozubix: to źle myslisz, tutaj przykład strony którą ostatnio przerabiałem:

pełna wersja: http://rozklady.kzkgop.pl/index.php?co=rozklady&submenu=tabliczka&nr_linii=T11&nr_przyst=3&id_trasy=16896
do druku: http://rozklady.kzkgop.pl/wydruk.php?plik=przystankowo3_16896.php&numer_linii=T11

różnica może nie jest ogromna zauważalna przy scrappowaniu całego rozkładu jazdy.

Była jeszcze jakaś z MPK... tylko nie pamiętam jaka to była strona.
Tam zaś nie warto było scrappować strony bo rekordy zwracała jsonem :)
@destyl: jesli PHP7 to tylko klient HTTP Guzzle - mozesz wyslac w jednym czasie wiele requestow - to sie nazywa concurrent requests (np 10 jednoczesnie) - ostatnio nawet robilem cos podobnego do scrapowania komentarzy :)
@destyl: takk zgadza sie. pewnie to ile requestow w jenym czasie mozesz wyslac zalezy od dostepnego RAMu. a jezeli chodzi o czasy to tutaj zalezy jakie masz lacze i jak szybko odpowiadaja sewery docelowe. ale Guzzle to jest taki starndard w swiecie PHP jezeli chodzi o klienta HTTP
Działa to zadziwiająco dobrze, zrobiłem tylko taki błąd że nie zadbałem o synchronizację dostępu do listy i zdarza się że dwa wątki pracują nad jedną stroną - ale w moim przypadku akurat to nie jest problem, marnuje się tylko chwilę czasu.


@kao3991: Queue.Queue albo collections.deque i masz z automatu rozwiązane :)