2011-02-12 12 views
5

Mam duże zadanie skrobania - większość czasu skryptu spędza się na blokowaniu ze względu na duże opóźnienie sieci. Próbuję wielowątkowego scenariusza, więc mogę zrobić kilka żądań jednocześnie, ale około 10% moich wątków umiera z powodu następującego błęduWielowątkowe żądania sieciowe w pythonie - "Nazwa lub usługa nieznana"

URLError: <urlopen error [Errno -2] Name or service not known> 

Pozostałe 90% zakończona pomyślnie. Żądam wielu stron z tej samej domeny, więc wygląda na to, że może być problem z DNS. Wykonuję 25 żądań na raz (25 wątków). Wszystko działa dobrze, jeśli ograniczę się do 5 żądań na raz, ale gdy dostanę około 10 żądań, czasami zaczynam widzieć ten błąd.

Przeczytałem Repeated host lookups failing in urllib2 , który opisuje ten sam problem, który mam i podążałem za sugestiami, ale bezskutecznie.

Próbowałem również używać wieloprocesorowego modułu zamiast wielowątkowości, otrzymuję to samo zachowanie - około 10% procesów umiera z tym samym błędem - co prowadzi mnie do przekonania, że ​​to nie jest problem z urllib2 ale coś jeszcze.

Czy ktoś może wyjaśnić, co się dzieje i zasugerować, jak to naprawić?

UPDATE

Gdybym ręcznie zakodować adres IP strony do mojego skryptu wszystko działa idealnie, więc ten błąd zdarza się czasami podczas wyszukiwania DNS.

+0

Czy masz dostęp do serwera? Być może natkniesz się na coś, z czym nie musisz się martwić, lub jeśli serwer nie jest tak ciężki, możesz go przeciążać ... – jswolf19

+0

To ważna strona internetowa, która może obsłużyć setki lub tysiące równoczesnych próśb, moje 25 nie robi nawet małego wgięcia. Jestem prawie pewien, że jest to problem z rozdzielczością dns, ponieważ jeśli wymieniam nazwę domeny na adres IP, mój skrypt działa perfekcyjnie - więc strona nie zamyka mnie wyraźnie. W tym momencie chcę tylko zrozumieć, dlaczego wyszukiwania DNS zawodzą. –

+0

Może to być problem z serwerem DNS, który dopuszcza tak wiele żądań od klienta przez określony czas lub co ty. – jswolf19

Odpowiedz

1

Sugestia: Spróbuj włączyć pamięć podręczną DNS w systemie, na przykład nscd. To powinno wyeliminować problemy z wyszukiwaniem DNS, jeśli skrobak zawsze wysyła żądania do tej samej domeny.

Upewnij się, że obiekty plików zwrócone przez urllib2.urlopen są poprawnie zamknięte po przeczytaniu, w celu zwolnienia zasobów. W przeciwnym razie możesz osiągnąć limit maksymalnych otwartych gniazd w systemie.

Weź również pod uwagę, że roboty indeksujące politeness policy powinny unikać przeciążania serwera z wieloma żądaniami.

+1

Zrobiłem obie te rzeczy, drugie pytanie przepełnienia stosu, do którego linkowałem w moim poście, zawiera obie te sugestie, ale nie rozwiązuje mojego problemu. Używam adresu IP bezpośrednio, a nie domeny, ale nie rozumiem, dlaczego nscd nie rozwiązuje tego problemu, ponieważ wydaje się być związany z buforowaniem DNS. –

Powiązane problemy