Wie verwende ich Python-Anfragen, um einen Browser-Besuch vorzutäuschen?

125

Ich möchte den Inhalt von der folgenden Website erhalten. Wenn ich einen Browser wie Firefox oder Chrome verwende, kann ich die gewünschte Website-Seite abrufen. Wenn ich jedoch das Python-Anforderungspaket (oder den wgetBefehl) verwende, wird eine völlig andere HTML-Seite zurückgegeben. Ich dachte, der Entwickler der Website hätte einige Blöcke dafür gemacht, daher lautet die Frage:

Wie fälsche ich einen Browser-Besuch mithilfe von Python-Anfragen oder dem Befehl wget?

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

user1726366
quelle

Antworten:

279

Geben Sie einen User-AgentHeader an :

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)

Zu Ihrer Information, hier ist eine Liste von User-Agent-Zeichenfolgen für verschiedene Browser:


Als Randnotiz gibt es ein ziemlich nützliches Paket von Drittanbietern namens fake-useragent , das eine schöne Abstraktionsschicht über Benutzeragenten bietet:

fake-useragent

Aktueller einfacher Useragent-Fälscher mit realer Datenbank

Demo:

>>> 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
quelle
1
Vielen Dank für Ihre Antwort. Ich habe versucht, die Überschriften in meinen Anfragen zu verwenden, konnte aber immer noch nicht den tatsächlichen Inhalt der Seite abrufen. Es gibt die Zeichenfolge "In Ihrem Webbrowser muss JavaScript aktiviert sein, damit diese Anwendung korrekt angezeigt wird." Sollte ich auf der zurückgegebenen HTML-Seite Java-Skriptunterstützung in den Anforderungen hinzufügen? Wenn ja, wie würde ich das machen?
user1726366
8
@ user1726366: Sie können nicht einfach JavaScript-Unterstützung hinzufügen - dafür benötigen Sie einen JavaScript-Interpreter. Der einfachste Ansatz besteht darin, den JavaScript-Interpreter eines echten Webbrowsers zu verwenden. Sie können dies jedoch mithilfe von Selenium in Python automatisieren .
PM 2Ring
1
@ alecxe, @ sputnick: Ich habe versucht, die Pakete mit Wireshark zu erfassen, um den Unterschied zwischen der Verwendung von Python-Anforderungen und dem Browser zu vergleichen. Es scheint, dass die Website-URL keine statische ist. Ich muss warten, bis das Rendern der Seite abgeschlossen ist, sodass Selenium klingt die richtigen Werkzeuge für mich. Danke für deine freundliche Hilfe. :)
user1726366
4
@ user1726366 yup, wenn die Verwendung eines echten Browsers + Selens Ihren Anforderungen entspricht, ist dies der schmerzloseste Ansatz. Beachten Sie, dass Sie einen PhantomJSHeadless-Browser mit Selen verwenden können. Vielen Dank. (Vergessen Sie nicht, die Antwort zu akzeptieren, wenn es hilfreich war)
Alecxe
30

wenn diese Frage noch gültig ist

Ich habe gefälschten UserAgent verwendet

Wie benutzt man:

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)

Ausgabe:

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
quelle
immer noch Fehler 404
Maksim Kniazev
1
404 ist ein anderer Fehler. Sind Sie sicher, dass Sie die Seite mit einem Browser durchsuchen können?
Umesh Kaushik
Absolut. Ich habe das Gefühl, dass die Website, die ich verwenden möchte, alle Amazon EC2-IPs blockiert hat.
Maksim Kniazev
Könnten Sie bitte den Link hier anpingen? Ich kann es an meinem Ende versuchen. Wenn die IP blockiert ist, sollte der Fehlercode 403 (verboten) oder 401 (nicht autorisiert) sein. Es gibt Websites, auf denen das Scraping überhaupt nicht möglich ist. Darüber hinaus verwenden viele Websites Cloudflare, um zu vermeiden, dass Bots auf die Website zugreifen.
Umesh Kaushik
Hier ist mein Link regalbloodline.com/music/eminem . Es hat vorher gut funktioniert. Arbeitete nicht mehr an Python 2. Arbeitete an Python 3 auf dem lokalen Computer. Der Wechsel zu AWS EC2 hat dort nicht funktioniert. Fehler 404 erhalten. Dann wurde auch auf dem lokalen Computer nicht mehr gearbeitet. Die Verwendung der Browser-Emulation funktionierte auf einem lokalen Computer, jedoch nicht auf EC2. Am Ende gab ich auf und fand eine alternative Website zum Kratzen. Ist übrigens Wolkenfeuer zu vermeiden?
Maksim Kniazev
7

Versuchen Sie dies, indem Sie Firefox als gefälschten Benutzeragenten verwenden (außerdem ist es ein gutes Startskript für das Web-Scraping mithilfe von Cookies):

#!/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)

VERWENDUNG:

python script.py "http://www.ichangtou.com/#company:data_000008.html"
Gilles Quenot
quelle
3

Die Wurzel der Antwort ist, dass die Person, die die Frage stellt, einen JavaScript-Interpreter haben muss, um das zu bekommen, wonach sie sucht. Ich habe festgestellt, dass ich alle gewünschten Informationen auf einer Website in json abrufen kann, bevor sie von JavaScript interpretiert wurden. Dies hat mir eine Menge Zeit beim Parsen von HTML gespart, in der Hoffnung, dass jede Webseite das gleiche Format hat.

Wenn Sie also eine Antwort von einer Website mit Anfragen erhalten, schauen Sie sich wirklich den HTML / Text an, da Sie möglicherweise die Javascripts JSON in der Fußzeile finden, die zum Parsen bereit sind.

Daniel Butler
quelle