Lösen Sie Urllib HTTP Error 403 Forbidden Message in Python

Olorunfemi Akinlua 21 Juni 2023
  1. das urllib-Modul in Python
  2. Überprüfen Sie robots.txt, um urllib HTTP Error 403 Forbidden Message zu verhindern
  3. Hinzufügen von Cookies zu den Anforderungsheadern zum Lösen der HTTP-Fehlermeldung urllib 403 Forbidden
  4. Verwenden Sie das Sitzungsobjekt, um den urllib-HTTP-Fehler 403 Forbidden Message zu lösen
Lösen Sie Urllib HTTP Error 403 Forbidden Message in Python

Der heutige Artikel erklärt, wie man mit einer Fehlermeldung (Ausnahme) umgeht, urllib.error.HTTPError: HTTP Error 403: Forbidden, die von der error-Klasse im Auftrag der request-Klassen erzeugt wird, wenn sie auf eine verbotene Ressource trifft.

das urllib-Modul in Python

Die urllib Python-Modul behandelt URLs für Python über verschiedene Protokolle. Es ist berühmt für Web Scraper, die Daten von einer bestimmten Website erhalten möchten.

Die urllib enthält Klassen, Methoden und Funktionen, die bestimmte Operationen wie Lesen, Parsen von URLs und robots.txt ausführen. Es gibt vier Klassen, request, error, parse und robotparser.

Überprüfen Sie robots.txt, um urllib HTTP Error 403 Forbidden Message zu verhindern

Bei der Verwendung des Moduls urllib zur Interaktion mit Clients oder Servern über die Klasse request können bestimmte Fehler auftreten. Einer dieser Fehler ist der Fehler HTTP 403.

Beim Lesen einer URL erhalten wir die Fehlermeldung urllib.error.HTTPError: HTTP Error 403: Forbidden im Paket urllib. Der HTTP 403, der Forbidden Error, ist ein HTTP-Statuscode, der anzeigt, dass der Client oder Server den Zugriff auf eine angeforderte Ressource verbietet.

Wenn wir also diese Art von Fehlermeldung sehen, urllib.error.HTTPError: HTTP Error 403: Forbidden, versteht der Server die Anfrage, entscheidet aber, die von uns gesendete Anfrage nicht zu verarbeiten oder zu autorisieren.

Um zu verstehen, warum die Website, auf die wir zugreifen, unsere Anfrage nicht verarbeitet, müssen wir eine wichtige Datei, robots.txt, überprüfen. Vor dem Web Scraping oder der Interaktion mit einer Website wird oft empfohlen, diese Datei zu überprüfen, um zu wissen, was Sie erwartet, und um keine weiteren Probleme zu haben.

Um es auf jeder Website zu überprüfen, können wir dem folgenden Format folgen.

https://<website.com>/robots.txt

Überprüfen Sie beispielsweise die robots.txt-Dateien von YouTube, Amazon und Google.

https://www.youtube.com/robots.txt
https://www.amazon.com/robots.txt
https://www.google.com/robots.txt

Die Überprüfung von YouTube robots.txt ergibt das folgende Ergebnis.

# robots.txt file for YouTube
# Created in the distant future (the year 2000) after
# the robotic uprising of the mid-'90s wiped out all humans.

User-agent: Mediapartners-Google*
Disallow:

User-agent: *
Disallow: /channel/*/community
Disallow: /comment
Disallow: /get_video
Disallow: /get_video_info
Disallow: /get_midroll_info
Disallow: /live_chat
Disallow: /login
Disallow: /results
Disallow: /signup
Disallow: /t/terms
Disallow: /timedtext_video
Disallow: /user/*/community
Disallow: /verify_age
Disallow: /watch_ajax
Disallow: /watch_fragments_ajax
Disallow: /watch_popup
Disallow: /watch_queue_ajax

Sitemap: https://www.youtube.com/sitemaps/sitemap.xml
Sitemap: https://www.youtube.com/product/sitemap.xml

Wir können dort viele Disallow-Tags bemerken. Dieses Disallow-Tag zeigt den nicht zugänglichen Bereich der Website an. Daher werden Anfragen an diese Bereiche nicht bearbeitet und sind verboten.

In anderen robots.txt-Dateien sehen wir möglicherweise ein Allow-Tag. Beispielsweise ist http://youtube.com/comment jeder externen Anfrage untersagt, auch mit dem urllib-Modul.

Lassen Sie uns Code schreiben, um Daten von einer Website zu kratzen, die beim Zugriff einen HTTP 403-Fehler zurückgibt.

Beispielcode:

import urllib.request
import re

webpage = urllib.request.urlopen(
    "https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi"
).read()
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')

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

print(len(row_array))

Ausgang:

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\Python\index.py", line 7, in <module>
    webpage = urllib.request.urlopen('https://www.cmegroup.com/markets/products.html?redirect=/trading/products/#cleared=Options&sortField=oi').read()
  File "C:\Python310\lib\urllib\request.py", line 216, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python310\lib\urllib\request.py", line 525, in open
    response = meth(req, response)
  File "C:\Python310\lib\urllib\request.py", line 634, in http_response
    response = self.parent.error(
  File "C:\Python310\lib\urllib\request.py", line 563, in error
    return self._call_chain(*args)
  File "C:\Python310\lib\urllib\request.py", line 496, in _call_chain
    result = func(*args)
  File "C:\Python310\lib\urllib\request.py", line 643, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

Der Grund ist, dass uns der Zugriff auf die Website untersagt ist. Wenn wir jedoch die robots.txt Datei überprüfen, werden wir feststellen, dass https://www.cmegroup.com/markets/ nicht mit einem Disallow-Tag versehen ist. Wenn wir jedoch die Datei robots.txt für die Website, die wir kratzen wollten, nach unten gehen, finden wir das Folgende.

User-agent: Python-urllib/1.17
Disallow: /

Der obige Text bedeutet, dass der Benutzeragent namens Python-urllib keine URLs innerhalb der Site crawlen darf. Das bedeutet, dass die Verwendung des Python-Moduls urllib die Site nicht crawlen darf.

Überprüfen oder parsen Sie daher die robots.txt, um zu erfahren, auf welche Ressourcen wir Zugriff haben. Wir können die Datei robots.txt mit der Klasse robotparser parsen. Diese können verhindern, dass in unserem Code die Fehlermeldung urllib.error.HTTPError: HTTP Error 403: Forbidden angezeigt wird.

Hinzufügen von Cookies zu den Anforderungsheadern zum Lösen der HTTP-Fehlermeldung urllib 403 Forbidden

Das Übergeben eines gültigen Benutzeragenten als Header-Parameter behebt das Problem schnell. Die Website kann Cookies als Anti-Scraping-Maßnahme verwenden.

Die Website kann Cookies setzen und verlangen, dass sie zurückgesendet werden, um ein Scraping zu verhindern, was möglicherweise gegen ihre Richtlinien verstößt.

from urllib.request import Request, urlopen


def get_page_content(url, head):

    req = Request(url, headers=head)
    return urlopen(req)


url = "https://example.com"
head = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
    "Accept-Encoding": "none",
    "Accept-Language": "en-US,en;q=0.8",
    "Connection": "keep-alive",
    "refere": "https://example.com",
    "cookie": """your cookie value ( you can get that from your web page) """,
}

data = get_page_content(url, head).read()
print(data)

Ausgang:

<!doctype html>\n<html>\n<head>\n    <title>Example Domain</title>\n\n    <meta
'
'
'
<p><a href="https://www.iana.org/domains/example">More information...</a></p>\n</div>\n</body>\n</html>\n'

Das Übergeben eines gültigen Benutzeragenten als Header-Parameter behebt das Problem schnell.

Verwenden Sie das Sitzungsobjekt, um den urllib-HTTP-Fehler 403 Forbidden Message zu lösen

Manchmal kann selbst die Verwendung eines Benutzeragenten diesen Fehler nicht verhindern. Anschließend kann das Objekt Session des Moduls requests verwendet werden.

from random import seed
import requests

url = "https://stackoverflow.com/search?q=html+error+403"
session_obj = requests.Session()
response = session_obj.get(url, headers={"User-Agent": "Mozilla/5.0"})

print(response.status_code)

Ausgang:

200

Der obige Artikel findet die Ursache des urllib.error.HTTPError: HTTP Error 403: Forbidden und die Lösung, um damit umzugehen. mod_security verursacht diesen Fehler grundsätzlich, da verschiedene Webseiten unterschiedliche Sicherheitsmechanismen verwenden, um zwischen menschlichen und automatisierten Computern (Bots) zu unterscheiden.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Verwandter Artikel - Python Error