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
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@destyl: jak nie rzucisz skryptem to Ci nie powiem co można zoptymalizować ;) zamiast odpalania paru skryptów równolegle możesz je sobie wystartować w osobnych wątkach.
  • Odpowiedz
@destyl: zazwyczaj większym problemem są łącza i prędkość generowania strony niż sam crawler. Możesz trochę przyśpieszyć odpalając jednocześnie kilka wątków, ale pytanie co na to powie admin strony którą pobierasz.
  • Odpowiedz
@destyl: php7 by sobie poradził tak samo, bo najwięcej tracisz zapewne na pobieranie strony. Użyj scrapy. Samo się ładnie zrównolegla, więc będzie n---------ć requestami aż miło, a nie musisz tej logiki pisać samemu.
  • Odpowiedz
@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
  • Odpowiedz
@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ę.
  • Odpowiedz
@destyl: Mały tip ode mnie: Jeżeli strona ma widok dla uderzeń mobilnych to użyj jego zamiast pełnej strony. Czasami takie strony działają dużo szybciej i krócej będziesz czekać na response
  • Odpowiedz
@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 :)
  • Odpowiedz
@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
  • Odpowiedz
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 :)
  • Odpowiedz
@destyl: poradziłby sobie tak, jak byś go napisał. Może lepiej, może wolniej. Głównym bottleneckiem jest łącze, więc wybór języka jest pewnie drugorzędny.
  • Odpowiedz