在Python 3网页抓取HTTP错误403(HTTP error 403 in Python 3

2019-09-16 02:25发布

我试图放弃练习一个网站,但我一直在得到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

Answer 1:

这可能是因为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()

这对我的作品。

顺便说一句,在你的代码你缺少的().readurlopen线,但我认为这是一个错字。

提示:因为这是锻炼,选择一个不同的,非限制性的网站。 也许他们是阻塞urllib出于某种原因...



Answer 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')

资源



Answer 3:

“这可能是因为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



Answer 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您需要调用来获取表的内容。



Answer 5:

您可以尝试两种方式。 细节是在这个环节 。

1)通过PIP

PIP安装--upgrade CERTIFI

2)如果它不工作,尝试运行与Python 3 *捆绑为Mac一个Cerificates.command:(转到你的Python安装位置,然后双击该文件)

打开/应用/ Python的\ 3。* /安装\ Certificates.command



文章来源: HTTP error 403 in Python 3 Web Scraping