Подтвердить что ты не робот

Ошибка HTTP 403 в Python 3 Веб-скребок

Я пытался отказаться от веб-сайта для практики, но я продолжал получать HTTP-ошибку 403 (кажется ли он, что я бот)?

Вот мой код:

#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 = []

Ошибка, которую я получаю:

 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
4b9b3361

Ответ 1

Вероятно, это связано с mod_security или некоторой аналогичной функцией безопасности сервера, которая блокирует известные агенты пользователя spider/bot (urllib использует что-то вроде python urllib/3.3.0, оно легко обнаруживается). Попробуйте установить известный пользовательский агент браузера:

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

Это работает для меня.

Кстати, в вашем коде вам не хватает () после .read в строке urlopen, но я думаю, что это опечатка.

СОВЕТ. Поскольку это упражнение, выберите другой, не ограничивающий сайт. Возможно, они почему-то блокируют urllib...

Ответ 2

Определенно, это блокирование из-за использования urllib на основе пользовательского агента. Это то же самое происходит со мной с помощью OfferUp. Вы можете создать новый класс под названием AppURLopener, который переопределяет пользовательский агент Mozilla.

import urllib.request

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

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

Источник

Ответ 3

"Вероятно, это связано с mod_security или некоторой аналогичной функцией безопасности сервера, которая блокирует известные

паук/бот

пользовательские агенты (urllib использует что-то вроде python urllib/3.3.0, он легко обнаруживается) "- как уже упоминалось Стефано Санфилиппо

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 - это байтовый объект, возвращаемый сервером, и тип содержимого, присутствующий на веб-странице, в основном utf-8. Поэтому вам необходимо декодировать web_byte с помощью метода декодирования.

Это решает полную проблему, когда я пытался отказаться от веб-сайта с помощью PyCharm

P.S → Я использую python 3.4

Ответ 4

Поскольку страница работает в браузере, а не при вызове в программе python, похоже, что веб-приложение, которое служит для url, распознает, что вы запрашиваете содержимое не браузером.

Демонстрация:

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>

а содержимое в r.txt имеет строку состояния:

HTTP/1.1 403 Forbidden

Попробуйте опубликовать заголовок "User-Agent", который подделывает веб-клиента.

ПРИМЕЧАНИЕ. На странице содержится вызов Ajax, который создает таблицу, которую вы, вероятно, хотите проанализировать. Вам нужно будет проверить логику JavaScript на странице или просто использовать отладчик браузера (например, вкладку Firebug/Net), чтобы узнать, какой URL-адрес вам нужно вызвать, чтобы получить содержимое таблицы.