160 votes

Problème d'erreur HTTP 403 dans Python 3 Web Scraping

J'essayais de gratter un site web pour m'entraîner, mais je continue à obtenir l'erreur HTTP 403 (est-ce qu'il pense que je suis un robot) ?

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 la suivante :

 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

2voto

Sudeep Prasad Points 81

Si vous vous sentez coupable de faire passer l'agent utilisateur pour Mozilla (commentaire dans la réponse de Stefano), cela pourrait également fonctionner avec un agent utilisateur non urllib. Cela a fonctionné pour les sites que je référence :

    req = urlrequest.Request(link, headers={'User-Agent': 'XYZ/3.0'})
    urlrequest.urlopen(req, timeout=10).read()

Mon but est de tester la validité de ce système en récupérant des liens spécifiques auxquels je fais référence dans mes articles. Pas un scraper générique.

1voto

Johnson Points 17

Vous pouvez essayer de deux façons. Le détail est dans ce lien .

1) Via pip

pip install --upgrade certifi

2) Si cela ne fonctionne pas, essayez d'exécuter un Cerificates.command qui est fourni avec Python 3.* pour Mac : (Allez à l'endroit où vous avez installé Python et double-cliquez sur le fichier).

ouvrir /Applications/Python\ 3.*/Installation des certificats.command

1voto

Deepesh Nair Points 151

L'ajout d'un cookie dans les en-têtes de la demande a fonctionné pour moi.

from urllib.request import Request, urlopen

# Function to get the page content
def get_page_content(url, head):
  """
  Function to get the page content
  """
  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)

0 votes

Tu m'as sauvé. J'ai rencontré une url qui a besoin d'ajouter d'autres choses dans le header comme 'origin' = 'url1' , 'referrer' = 'url1' pour faire la requête sans que 403 se produise.

1voto

Charlie Vrattos Points 11

J'ai rencontré le même problème et je n'ai pas réussi à le résoudre en utilisant les réponses ci-dessus. J'ai fini par contourner le problème en utilisant requests.get() puis en utilisant le .text du résultat au lieu d'utiliser read() :

from requests import get

req = get(link)
result = req.text

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X