it-swarm.com.de

HTTP-Fehler 403 in Python 3 Web Scraping

Ich habe versucht, eine Website zum Üben zu verwerfen, aber ich habe immer wieder den HTTP-Fehler 403 erhalten (denkt ich, ich bin ein Bot)?

Hier ist mein Code:

#import requests
import urllib.request
from bs4 import BeautifulSoup
#from urllib import urlopen
import re

webpage = urllib.request.urlopen('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1').read
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')

row_array = re.findall(findrows, webpage)
links = re.finall(findlink, webpate)

print(len(row_array))

iterator = []

Der Fehler, den ich erhalte, ist:

 File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python33\lib\urllib\request.py", line 479, in open
    response = meth(req, response)
  File "C:\Python33\lib\urllib\request.py", line 591, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python33\lib\urllib\request.py", line 517, in error
    return self._call_chain(*args)
  File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
    result = func(*args)
  File "C:\Python33\lib\urllib\request.py", line 599, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
60
Josh

Dies ist wahrscheinlich auf mod_security oder eine ähnliche Server-Sicherheitsfunktion zurückzuführen, die bekannte Spider/Bot-Benutzeragenten blockiert (urllib verwendet etwas wie python urllib/3.3.0, das kann leicht erkannt werden). Legen Sie einen bekannten Browser-Benutzeragenten fest mit:

from urllib.request import Request, urlopen

req = Request('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1', headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()

Das funktioniert für mich.

Übrigens, in Ihrem Code fehlt der () hinter .read in der urlopen-Zeile, aber ich denke, dass es sich um einen Tippfehler handelt.

TIPP: Wählen Sie eine andere, nicht einschränkende Website, da dies Übung ist. Vielleicht blockieren sie urllib aus irgendeinem Grund ...

125

Es ist definitiv eine Blockierung, weil Sie urllib basierend auf dem Benutzeragenten verwenden. Dasselbe passiert mir mit OfferUp. Sie können eine neue Klasse namens AppURLopener erstellen, die den Benutzeragenten mit Mozilla überschreibt. 

import urllib.request

class AppURLopener(urllib.request.FancyURLopener):
    version = "Mozilla/5.0"

opener = AppURLopener()
response = opener.open('http://httpbin.org/user-agent')

Quelle

32
zeta

Msgstr "" "Dies ist wahrscheinlich auf mod_security oder eine ähnliche Server - Sicherheitsfunktion zurückzuführen, die bekannte Blöcke blockiert 

spinne/Bot

benutzeragenten (urllib verwendet so etwas wie Python urllib/3.3.0, es ist leicht zu erkennen) "- wie bereits von Stefano Sanfilippo erwähnt

from urllib.request import Request, urlopen
url="https://stackoverflow.com/search?q=html+error+403"
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})

web_byte = urlopen(req).read()

webpage = web_byte.decode('utf-8')

Das web_byte ist ein vom Server zurückgegebenes Byte-Objekt, und der Inhalt der Webseite ist meistens utf-8 . Daher müssen Sie web_byte mit der Decodiermethode dekodieren.

Dies löst ein vollständiges Problem, als ich mit PyCharm von einer Website ausrangierte. 

P.S -> Ich benutze Python 3.4

6
royatirek

Da die Seite im Browser und nicht beim Aufrufen innerhalb des Programms python funktioniert, scheint die Webanwendung, die url bedient, zu erkennen, dass Sie den Inhalt nicht per anfordern der Browser.

Demonstration:

curl --dump-header r.txt http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1

...
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
You don't have permission to access ...
</HTML>

und der Inhalt in r.txt hat Statuszeile:

HTTP/1.1 403 Forbidden

Versuchen Sie, den Header 'User-Agent' zu veröffentlichen, der einen Web-Client fälscht.

HINWEIS: Die Seite enthält einen Ajax-Aufruf, der die Tabelle erstellt, die Sie wahrscheinlich analysieren möchten. Sie müssen die JavaScript-Logik der Seite überprüfen oder einfach den Browser-Debugger (z. B. Firebug/Net) verwenden, um festzustellen, welche URL Sie aufrufen müssen, um den Inhalt der Tabelle abzurufen.

1
Robert Lujo

Sie können es auf zwei Arten versuchen. Das Detail ist in diesem link

1) Über Pip

pip install --upgrade certifi

2) Falls dies nicht funktioniert, führen Sie einen Cerificates.command aus, der im Lieferumfang von Python 3 enthalten ist. * Für Mac: (Gehen Sie zu Ihrem Python-Installationsverzeichnis und doppelklicken Sie auf die Datei)

Öffnen Sie/Applications/Python\3. */Install\Certificates.command

0
Johnson