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