Ошибка 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:Python33liburllibrequest.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:Python33liburllibrequest.py", line 479, in open
    response = meth(req, response)
  File "C:Python33liburllibrequest.py", line 591, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:Python33liburllibrequest.py", line 517, in error
    return self._call_chain(*args)
  File "C:Python33liburllibrequest.py", line 451, in _call_chain
    result = func(*args)
  File "C:Python33liburllibrequest.py", line 599, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

4 ответов


это, вероятно, из-за 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 по какой-то причине...


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

import urllib.request

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

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

источник


поскольку страница работает в браузере, а не при вызове в программе 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 вам нужно вызвать, чтобы получить содержимое таблицы.