Jak wykorzystać żądania Pythona do sfałszowania wizyty w przeglądarce?
127
Chcę pobrać treść z poniższej strony internetowej. Jeśli używam przeglądarki takiej jak Firefox lub Chrome, mogę uzyskać prawdziwą stronę internetową, którą chcę, ale jeśli użyję pakietu (lub wgetpolecenia) żądań Pythona, aby ją pobrać, zwraca całkowicie inną stronę HTML. Myślałem, że twórca witryny zrobił w tym celu kilka bloków, więc pytanie brzmi:
Jak sfałszować wizytę w przeglądarce, używając żądań Pythona lub polecenia wget?
Na marginesie, istnieje całkiem przydatny pakiet innej firmy o nazwie fake-useragent, który zapewnia ładną warstwę abstrakcji nad agentami użytkownika:
fałszywy useragent
Aktualny, prosty faker użytkownika z rzeczywistą bazą danych
Próbny:
>>>from fake_useragent importUserAgent>>> ua =UserAgent()>>> ua.chrome
u'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36'>>> ua.random
u'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36'
dziękuję za odpowiedź, próbowałem z nagłówkami w moich żądaniach, ale nadal nie mogłem uzyskać prawdziwej zawartości strony, istnieje ciąg „Twoja przeglądarka internetowa musi mieć włączoną obsługę JavaScript, aby ta aplikacja wyświetlała się poprawnie”. na zwróconej stronie html, czy powinienem dodać obsługę skryptów java w żądaniach? Jeśli tak, jak miałbym to zrobić?
user1726366
8
@ user1726366: Nie możesz po prostu dodać obsługi JavaScript - potrzebujesz do tego interpretera JavaScript. Najprostszym podejściem jest użycie interpretera JavaScript prawdziwej przeglądarki internetowej, ale można to zautomatyzować z poziomu Pythona za pomocą Selenium .
PM 2Ring
1
@ alecxe, @ sputnick: Próbowałem przechwycić pakiety za pomocą wireshark, aby porównać różnicę między używaniem żądań Pythona i przeglądarki, wygląda na to, że adres URL witryny nie jest statyczny. Muszę poczekać na zakończenie renderowania strony, więc brzmi Selenium odpowiednie narzędzia dla mnie. Dziękuję za życzliwą pomoc. :)
user1726366
4
@ user1726366 tak, jeśli używasz prawdziwej przeglądarki + selen odpowiada Twoim potrzebom, to jest to najbardziej bezbolesne podejście. Zauważ, że możesz używać PhantomJSbezgłowej przeglądarki z selenem. Dzięki. (nie zapomnij przyjąć odpowiedzi, jeśli była pomocna)
alecxe
Okazuje się, że niektóre wyszukiwarki filtrują niektóre UserAgent. Czy ktoś wie, dlaczego? Czy ktoś mógłby podać listę akceptowanych UserAgentadresów?
from fake_useragent importUserAgentimport requests
ua =UserAgent()print(ua.chrome)
header ={'User-Agent':str(ua.chrome)}print(header)
url ="https://www.hybrid-analysis.com/recent-submissions?filter=file&sort=^timestamp"
htmlContent = requests.get(url, headers=header)print(htmlContent)
wynik:
Mozilla/5.0(Macintosh;IntelMac OS X 10_8_2)AppleWebKit/537.17(KHTML, like Gecko)Chrome/24.0.1309.0Safari/537.17{'User-Agent':'Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'}<Response[200]>
404 to inny błąd, na pewno możesz przeglądać stronę za pomocą przeglądarki?
Umesh Kaushik
Absolutnie. Wydaje mi się, że witryna internetowa, której próbuję użyć, blokowała wszystkie adresy IP Amazon EC2.
Maksim Kniazev
Czy możesz pingować link tutaj? Mogę spróbować na moim końcu. Ponadto, jeśli IP jest zablokowane, kod błędu powinien być 403 (zabroniony) lub 401 (nieautoryzowany). Istnieją strony internetowe, które w ogóle nie pozwalają na skrobanie. Ponadto wiele witryn korzysta z chmury, aby uniknąć dostępu botów do witryny.
Umesh Kaushik
Oto mój link regalbloodline.com/music/eminem . Wcześniej działało dobrze. Przestałem pracować na Pythonie 2. Pracowałem na Pythonie 3 na komputerze lokalnym. Przeniesienie do AWS EC2 tam nie działa. Zachowany błąd 404. Następnie przestał działać również na komputerze lokalnym. Używanie emulacji przeglądarki działało na komputerze lokalnym, ale nie na EC2. W końcu poddałem się i znalazłem alternatywną stronę do zeskrobania. Swoją drogą, czy można uniknąć pożaru chmur?
Maksim Kniazev
7
Spróbuj to zrobić, używając firefoxa jako fałszywego klienta użytkownika (co więcej, jest to dobry skrypt startowy do skrobania stron internetowych przy użyciu plików cookie):
#!/usr/bin/env python2# -*- coding: utf8 -*-# vim:ts=4:sw=4import cookielib, urllib2, sys
def doIt(uri):
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
page = opener.open(uri)
page.addheaders =[('User-agent','Mozilla/5.0')]print page.read()for i in sys.argv[1:]:
doIt(i)
Źródłem odpowiedzi jest to, że osoba zadająca pytanie musi mieć interpreter JavaScript, aby uzyskać to, czego szuka. Odkryłem, że jestem w stanie uzyskać wszystkie potrzebne informacje na stronie w formacie json, zanim zostały zinterpretowane przez JavaScript. Zaoszczędziło mi to mnóstwo czasu podczas analizowania kodu HTML, mając nadzieję, że każda strona internetowa jest w tym samym formacie.
Więc kiedy otrzymasz odpowiedź ze strony internetowej korzystającej z żądań, naprawdę spójrz na html / text, ponieważ możesz znaleźć JavaScript JSON w stopce gotowej do przeanalizowania.
PhantomJS
bezgłowej przeglądarki z selenem. Dzięki. (nie zapomnij przyjąć odpowiedzi, jeśli była pomocna)UserAgent
. Czy ktoś wie, dlaczego? Czy ktoś mógłby podać listę akceptowanychUserAgent
adresów?jeśli to pytanie jest nadal aktualne
Użyłem fałszywego UserAgent
Jak używać:
wynik:
źródło
Spróbuj to zrobić, używając firefoxa jako fałszywego klienta użytkownika (co więcej, jest to dobry skrypt startowy do skrobania stron internetowych przy użyciu plików cookie):
STOSOWANIE:
źródło
Źródłem odpowiedzi jest to, że osoba zadająca pytanie musi mieć interpreter JavaScript, aby uzyskać to, czego szuka. Odkryłem, że jestem w stanie uzyskać wszystkie potrzebne informacje na stronie w formacie json, zanim zostały zinterpretowane przez JavaScript. Zaoszczędziło mi to mnóstwo czasu podczas analizowania kodu HTML, mając nadzieję, że każda strona internetowa jest w tym samym formacie.
Więc kiedy otrzymasz odpowiedź ze strony internetowej korzystającej z żądań, naprawdę spójrz na html / text, ponieważ możesz znaleźć JavaScript JSON w stopce gotowej do przeanalizowania.
źródło