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?

http://www.ichangtou.com/#company:data_000008.html

user1726366
źródło

Odpowiedzi:

283

Podaj User-Agentnagłówek :

import requests

url = 'http://www.ichangtou.com/#company:data_000008.html'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

response = requests.get(url, headers=headers)
print(response.content)

FYI, oto lista ciągów User-Agent dla różnych przeglądarek:


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 import UserAgent
>>> 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'
alecxe
źródło
1
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?
dallonsi
30

jeśli to pytanie jest nadal aktualne

Użyłem fałszywego UserAgent

Jak używać:

from fake_useragent import UserAgent
import 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; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/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]>
Umesh Kaushik
źródło
nadal pojawia się błąd 404
Maksim Kniazev
1
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=4


import 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)

STOSOWANIE:

python script.py "http://www.ichangtou.com/#company:data_000008.html"
Gilles Quenot
źródło
3

Ź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.

Daniel Butler
źródło