我试图放弃练习一个网站,但我一直在得到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
这可能是因为mod_security
或阻止已知的蜘蛛/机器人用户代理一些类似的服务器安全功能( 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新的类,它覆盖的用户代理和Mozilla。
import urllib.request
class AppURLopener(urllib.request.FancyURLopener):
version = "Mozilla/5.0"
opener = AppURLopener()
response = opener.open('http://httpbin.org/user-agent')
资源
“这可能是因为mod_security的或阻止已知一些类似的服务器安全功能
蜘蛛/机器人
如已经斯特凡诺圣菲利波提到的 - 用户代理(urllib的使用有点像蟒蛇的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网站放弃这解决了完整的问题
PS - >我使用Python 3.4
由于页作品在浏览器,而不是Python程序内调用时,似乎那个供应的Web应用程序的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
尝试张贴标题“用户代理”,这假货的Web客户端。
注:该页面包含Ajax调用创建你可能要解析表。 你需要检查页面的JavaScript逻辑,或者干脆利用浏览器的调试器(如Firebug / Net选项卡),看看哪些URL您需要调用来获取表的内容。
您可以尝试两种方式。 细节是在这个环节 。
1)通过PIP
PIP安装--upgrade CERTIFI
2)如果它不工作,尝试运行与Python 3 *捆绑为Mac一个Cerificates.command:(转到你的Python安装位置,然后双击该文件)
打开/应用/ Python的\ 3。* /安装\ Certificates.command