python – Python 3 Web Scraping中的HTTP错误403

问题:

我试图通过抓取网站来进行练习,但是我一直收到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

I was trying to scrap a website for practice, but I kept on getting the HTTP Error 403 (does it think I’m a bot)?Here is my code:The error I get is:

解决方案:

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

这对我有用。

顺便说一句,在您的代码中,您在urlopen行中的.read之后缺少() ,但是我认为这是一个错字。

提示:由于这是练习,因此请选择其他非限制性站点。 也许他们出于某种原因阻止了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之类的东西,很容易检测到)”-正如Stefano Sanfilippo所述

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

方案4:

由于该页面在浏览器中工作,而不是在python程序中调用时工作,因此似乎提供该URL的Web应用程序识别出您不是通过浏览器请求内容。

示范:

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才能获取表的内容。

方案5:

您可以通过两种方式尝试。 详细信息在此链接中

1)通过点

点安装-升级证书

2)如果它不起作用,请尝试运行Mac的Python 3. *附带的Cerificates.command :(转到python的安装位置,然后双击该文件)

打开/ Applications / Python \\ 3。* / Install \\ Certificates.command

参考连接:

https://stackoverflow.com/questions/16627227/16627227