web-dev-qa-db-fra.com

Erreur HTTP 403 dans Python 3 Web Scraping

J'essayais de supprimer un site Web pour m'entraîner, mais je continuais à obtenir l'erreur HTTP 403 (pense-t-il que je suis un bot)?

Voici mon 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 = []

L'erreur que je reçois est:

 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

Ceci est probablement dû à mod_security ou à une fonctionnalité de sécurité de serveur similaire qui bloque les agents utilisateurs connus de spider/bot (urllib utilise quelque chose comme python urllib/3.3.0, il est facilement détecté). Essayez de définir un agent utilisateur de navigateur connu avec:

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

Cela fonctionne pour moi.

Au fait, il manque dans votre code le () après le .read dans la ligne urlopen, mais je pense que c'est une faute de frappe.

CONSEIL: comme il s’agit d’un exercice, choisissez un site différent, non restrictif. Peut-être qu'ils bloquent urllib pour une raison quelconque ...

125

C'est définitivement bloquant à cause de votre utilisation d'urllib basé sur l'agent utilisateur. La même chose me arrive avec OfferUp. Vous pouvez créer une nouvelle classe appelée AppURLopener qui remplace l'agent utilisateur avec Mozilla. 

import urllib.request

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

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

La source

32
zeta

"C’est probablement à cause de mod_security ou d’un dispositif de sécurité similaire qui bloque les 

araignée/bot

les agents utilisateurs (urllib utilise quelque chose comme python urllib/3.3.0, il est facilement détecté) "- comme déjà mentionné par Stefano Sanfilippo

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

Web_byte est un objet octet renvoyé par le serveur et le type de contenu présent dans la page Web est principalement/ utf-8 . Par conséquent, vous devez décoder web_byte à l'aide de la méthode de décodage.

Cela résout le problème lorsque je tentais de supprimer un site Web à l'aide de PyCharm 

P.S -> J'utilise python 3.4

6
royatirek

Étant donné que la page fonctionne dans le navigateur et non lors d'un appel dans un programme python, il semble que l'application Web qui le sert url reconnaît que vous demandez le contenu non par le navigateur.

Manifestation:

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>

et le contenu de r.txt a la ligne d'état:

HTTP/1.1 403 Forbidden

Essayez de poster l'en-tête 'User-Agent' qui imite le client Web.

NOTE: La page contient l'appel Ajax qui crée la table que vous souhaitez probablement analyser. Vous devrez vérifier la logique javascript de la page ou tout simplement en utilisant le débogueur de navigateur (comme l'onglet Firebug/Net) pour voir quelle URL vous devez appeler pour obtenir le contenu de la table.

1
Robert Lujo

Vous pouvez essayer de deux manières. Le détail est dans ce lien

1) via pip

pip installer --upgrade certifi

2) Si cela ne fonctionne pas, essayez d'exécuter une Cerificates.command fournie avec Python 3. * pour Mac: (accédez à l'emplacement d'installation de votre python et double-cliquez sur le fichier)

open/Applications/Python\3. */Install\Certificates.command

0
Johnson