Próbuję opracować prosty skrobak do sieci. Chcę wyodrębnić tekst bez kodu HTML. W rzeczywistości osiągam ten cel, ale widziałem, że na niektórych stronach, na których ładowany jest JavaScript, nie uzyskałem dobrych wyników.
Na przykład, jeśli jakiś kod JavaScript dodaje jakiś tekst, nie widzę go, ponieważ kiedy dzwonię
response = urllib2.urlopen(request)
Dostaję oryginalny tekst bez dodanego (ponieważ JavaScript jest wykonywany w kliencie).
Dlatego szukam pomysłów na rozwiązanie tego problemu.
python
web-scraping
python-2.x
urlopen
mocopera
źródło
źródło
Odpowiedzi:
EDYCJA 30 grudnia 2017 r .: Ta odpowiedź pojawia się w najlepszych wynikach wyszukiwania Google, więc postanowiłem ją zaktualizować. Stara odpowiedź wciąż się kończy.
dryscape nie jest już utrzymywany, a biblioteka zalecana przez programistów dryscape to tylko Python 2. Odkryłem, że korzystanie z biblioteki Pythona Selenium z Phantom JS jako sterownikiem sieciowym jest wystarczająco szybkie i łatwe do wykonania pracy.
Po zainstalowaniu Phantom JS upewnij się, że
phantomjs
plik binarny jest dostępny w bieżącej ścieżce:Przykład
Aby dać przykład, utworzyłem przykładową stronę z następującym kodem HTML. ( link ):
bez javascript jest napisane:
No javascript support
a z javascript:Yay! Supports javascript
Skrobanie bez obsługi JS:
Skrobanie z obsługą JS:
Możesz także użyć biblioteki Python dryscrape, aby zeskrobać strony internetowe oparte na JavaScript.
Skrobanie z obsługą JS:
źródło
@Expenzor
Pracuję na oknach. PhantomJS działa dobrze.Nie otrzymujemy poprawnych wyników, ponieważ wszelkie treści generowane przez JavaScript muszą być renderowane w modelu DOM. Kiedy pobieramy stronę HTML, pobieramy początkowy, niezmodyfikowany przez javascript, DOM.
Dlatego przed zaindeksowaniem strony musimy wyrenderować zawartość JavaScript.
Ponieważ selen jest już wielokrotnie wspominany w tym wątku (io tym, jak wolno to robi się czasami wspominano), wymienię dwa inne możliwe rozwiązania.
Rozwiązanie 1: To jest bardzo fajny samouczek na temat używania Scrapy do indeksowania treści generowanych przez javascript i zamierzamy to zrobić.
Czego będziemy potrzebować:
Docker zainstalowany na naszej maszynie. Jest to plus w stosunku do innych rozwiązań do tego momentu, ponieważ wykorzystuje platformę niezależną od systemu operacyjnego.
Zainstaluj Splash zgodnie z instrukcjami podanymi dla naszego odpowiedniego systemu operacyjnego.
Cytowanie z dokumentacji splash:
Zasadniczo będziemy używać Splash do renderowania treści generowanych przez Javascript.
Uruchomić serwer ochlapanie:
sudo docker run -p 8050:8050 scrapinghub/splash
.Zainstaluj wtyczkę scrapy-splash :
pip install scrapy-splash
Zakładając, że mamy już utworzony projekt Scrapy (jeśli nie, zróbmy taki ), będziemy postępować zgodnie z instrukcją i zaktualizować
settings.py
:Wreszcie możemy użyć
SplashRequest
:Rozwiązanie 2: Nazwijmy to w tej chwili eksperymentem (maj 2018) ...
To rozwiązanie jest przeznaczone tylko dla wersji 3.6 Pythona (w tej chwili).
Czy znasz moduł zgłoszeń (kto go nie zna )?
Teraz ma małe rodzeństwo indeksujące sieć: request-HTML :
Zainstaluj request-html:
pipenv install requests-html
Wyślij żądanie do adresu URL strony:
Renderuj odpowiedź, aby uzyskać bity wygenerowane przez JavaScript:
Wreszcie, moduł wydaje się oferować możliwości skrobania .
Alternatywnie możemy wypróbować dobrze udokumentowany sposób użycia BeautifulSoup z
r.html
właśnie wyrenderowanym obiektem.źródło
r.html.html
obiekcie.Może selen to potrafi.
źródło
Jeśli kiedykolwiek wcześniej korzystałeś z
Requests
modułu dla Pythona, niedawno dowiedziałem się, że programista stworzył nowy moduł o nazwie,Requests-HTML
który teraz ma również możliwość renderowania JavaScript.Możesz również odwiedzić https://html.python-requests.org/, aby dowiedzieć się więcej o tym module, lub jeśli jesteś zainteresowany renderowaniem JavaScript, możesz odwiedzić https://html.python-requests.org/?#javascript -wsparcie aby bezpośrednio dowiedzieć się, jak używać modułu do renderowania JavaScript za pomocą Pythona.
Zasadniczo, po poprawnym zainstalowaniu
Requests-HTML
modułu, poniższy przykład, który jest pokazany w powyższym linku , pokazuje, jak możesz użyć tego modułu do zeskrobania strony internetowej i renderowania JavaScript zawartego w witrynie:Niedawno dowiedziałem się o tym z filmu na YouTube. Kliknij tutaj! aby obejrzeć film na YouTube, który pokazuje, jak działa moduł.
źródło
Wydaje się, że to również dobre rozwiązanie, zaczerpnięte ze świetnego wpisu na blogu
źródło
Wygląda na to, że do danych, których naprawdę szukasz, można uzyskać dostęp za pośrednictwem dodatkowego adresu URL wywoływanego przez jakiś kod JavaScript na stronie głównej.
Chociaż możesz spróbować uruchomić javascript na serwerze, aby sobie z tym poradzić, prostszym podejściem może być załadowanie strony za pomocą przeglądarki Firefox i użycie narzędzia takiego jak Charles lub Firebug, aby dokładnie określić, jaki jest ten dodatkowy adres URL. Następnie możesz po prostu zapytać ten adres URL bezpośrednio o dane, które Cię interesują.
źródło
Selen jest najlepszy do skrobania zawartości JS i Ajax.
Zapoznaj się z tym artykułem, aby dowiedzieć się, jak wyodrębniać dane z Internetu za pomocą języka Python
Następnie pobierz sterownik internetowy Chrome.
Łatwe, prawda?
źródło
Możesz również uruchomić JavaScript za pomocą webdrivera.
lub zapisz wartość w zmiennej
źródło
driver.title
nieruchomościOsobiście wolę używać złomu i selenu oraz dokeryzować oba w osobnych pojemnikach. W ten sposób możesz zainstalować zarówno przy minimalnym wysiłku, jak i przeszukiwać nowoczesne strony internetowe, które prawie wszystkie zawierają JavaScript w takiej czy innej formie. Oto przykład:
Użyj,
scrapy startproject
aby stworzyć skrobak i napisać pająka, szkielet może być tak prosty:Prawdziwa magia dzieje się w middlewares.py. Zastąp dwie metody w oprogramowaniu pośredniczącym pobierania
__init__
iprocess_request
w następujący sposób:Nie zapomnij włączyć tego oprogramowania pośredniego, odkomentowując kolejne wiersze w pliku settings.py:
Dalej do dokeryzacji. Utwórz swój
Dockerfile
z lekkiego obrazu (używam tutaj Python Alpine), skopiuj do niego katalog projektu, zainstaluj wymagania:I wreszcie zbierz to wszystko razem w
docker-compose.yaml
:Biegać
docker-compose up -d
. Jeśli robisz to za pierwszym razem, pobranie najnowszego selenu / samodzielnego chromu zajmie trochę czasu, a także zbudowanie obrazu skrobaka.Po zakończeniu możesz sprawdzić, czy Twoje kontenery są uruchomione,
docker ps
a także sprawdzić, czy nazwa kontenera selenu jest zgodna ze zmienną środowiskową, którą przekazaliśmy do naszego kontenera skrobaka (tutaj było toSELENIUM_LOCATION=samplecrawler_selenium_1
).Wprowadź swój pojemnik na skrobaki za pomocą
docker exec -ti YOUR_CONTAINER_NAME sh
, polecenie dla mnie brzmiałodocker exec -ti samplecrawler_my_scraper_1 sh
, cd do odpowiedniego katalogu i uruchom skrobak za pomocąscrapy crawl my_spider
.Całość jest na mojej stronie github i możesz ją pobrać stąd
źródło
Mieszanka BeautifulSoup i Selenium działa na mnie bardzo dobrze.
PS Więcej warunków oczekiwania znajdziesz tutaj
źródło
Będziesz chciał użyć urllib, requestów, sterownika webowego beautifulSoup i selenium w swoim skrypcie dla różnych części strony (żeby wymienić tylko kilka).
Czasami wystarczy jeden z tych modułów.
Czasami będziesz potrzebować dwóch, trzech lub wszystkich tych modułów.
Czasami będziesz musiał wyłączyć js w swojej przeglądarce.
Czasami będziesz potrzebować informacji nagłówka w swoim skrypcie.
Żadnej witryny nie można zeskrobać w ten sam sposób ani żadnej witryny sieci Web nie można zeskrobać w ten sam sposób na zawsze bez konieczności modyfikowania robota indeksującego, zwykle po kilku miesiącach. Ale wszystkie można zeskrobać! Gdzie jest wola, na pewno jest sposób.
Jeśli potrzebujesz nieustannie pobieranych danych w przyszłości, po prostu zeskrob wszystko, czego potrzebujesz i przechowuj je w plikach .dat za pomocą zalewy.
Po prostu szukaj dalej, jak wypróbować te moduły i kopiuj i wklejaj błędy do Google.
źródło
Korzystanie z PyQt5
źródło
Od dwóch dni staram się znaleźć odpowiedź na to pytanie. Wiele odpowiedzi kieruje cię do różnych kwestii. Ale odpowiedź serpentra powyżej jest naprawdę na temat. To najkrótsze, najprostsze rozwiązanie. Przypominamy, że ostatnie słowo „var” reprezentuje nazwę zmiennej , dlatego powinno być używane jako:
źródło
Miałem do czynienia z tym samym problemem w niektórych moich własnych projektach do skrobania sieci. Sposób, w jaki sobie z tym poradziłem, polegał na użyciu biblioteki żądań Pythona w celu wysłania żądania http bezpośrednio do API, zamiast konieczności ładowania JS.
Biblioteka żądań Pythona działa dobrze w tym celu i możesz zobaczyć żądania http, używając elementu inspect i przechodząc do karty sieci.
źródło