Python 3 Web 抓取中的问题 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

原文由 Josh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 685
2 个回答

这可能是因为 mod_security 或一些类似的服务器安全功能阻止了已知的蜘蛛/机器人用户代理( urllib 使用类似于 python urllib/3.3.0 的东西,它很容易被检测到 - )。尝试设置一个已知的浏览器用户代理:

 from urllib.request import Request, urlopen

req = Request(
    url='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 出于某种原因……

原文由 Stefano Sanfilippo 发布,翻译遵循 CC BY-SA 4.0 许可协议

由于您使用基于用户代理的 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')

资源

原文由 zeta 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题