使用 Python 进行网页抓取时如何避免 HTTP 错误 403?

2025-02-12 10:03:00
admin
原创
69
摘要:问题描述:当我尝试使用此代码来抓取网页时:#import requests import urllib.request from bs4 import BeautifulSoup #from urllib import urlopen import re webpage = urllib.request.u...

问题描述:

当我尝试使用此代码来抓取网页时:

#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:Python33lib/urllib
equest.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:Python33lib/urllib
equest.py", line 479, in open
    response = meth(req, response)
  File "C:Python33lib/urllib
equest.py", line 591, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:Python33lib/urllib
equest.py", line 517, in error
    return self._call_chain(*args)
  File "C:Python33lib/urllib
equest.py", line 451, in _call_chain
    result = func(*args)
  File "C:Python33lib/urllib
equest.py", line 599, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

网站是否认为我是机器人?我该如何解决这个问题?


解决方案 1:

这可能是由于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出于某种原因而封锁了...

解决方案 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:

根据之前的答案,通过将超时时间增加到 10,这对我使用 Python 3.7 很有效。

from urllib.request import Request, urlopen

req = Request('Url_Link', headers={'User-Agent': 'XYZ/3.0'})
webpage = urlopen(req, timeout=10).read()

print(webpage)

解决方案 5:

在请求标头中添加 cookie 对我有用

from urllib.request import Request, urlopen

# Function to get the page content
def get_page_content(url, head):
  """
  Function to get the page content
  """
  req = Request(url, headers=head)
  return urlopen(req)

url = 'https://example.com'
head = {
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36',
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
  'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
  'Accept-Encoding': 'none',
  'Accept-Language': 'en-US,en;q=0.8',
  'Connection': 'keep-alive',
  'refere': 'https://example.com',
  'cookie': """your cookie value ( you can get that from your web page) """
}

data = get_page_content(url, head).read()
print(data)

解决方案 6:

如果您对将用户代理伪造为 Mozilla 感到内疚(Stefano 在顶部答案中发表评论),它也可以与非 urllib 用户代理一起使用。这对我引用的网站有效:

    req = urlrequest.Request(link, headers={'User-Agent': 'XYZ/3.0'})
    urlrequest.urlopen(req, timeout=10).read()

我的应用程序是通过抓取我文章中引用的特定链接来测试有效性。不是通用抓取工具。

解决方案 7:

由于该页面在浏览器中运行,而不是在 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

尝试发布伪造Web 客户端的标头“User-Agent”。

注意:该页面包含创建您可能想要解析的表的 Ajax 调用。您需要检查页面的 javascript 逻辑,或者简单地使用浏览器调试器(如 Firebug / Net tab)来查看需要调用哪个 URL 来获取表的内容。

解决方案 8:

你可以像这样使用 urllib 的 build_opener:

opener = urllib.request.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'), ('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8'), ('Accept-Encoding','gzip, deflate, br'),\n    ('Accept-Language','en-US,en;q=0.5' ), ("Connection", "keep-alive"), ("Upgrade-Insecure-Requests",'1')]
urllib.request.install_opener(opener)
urllib.request.urlretrieve(url, "test.xlsx")

解决方案 9:

你可以尝试两种方法。详细信息请见此链接。

1)通过pip

pip 安装--升级 certifi

2)如果不工作,请尝试运行与 Mac 版 Python 3.* 捆绑在一起的Cerificates.command:(转到您的 Python 安装位置并双击该文件)

打开 /Applications/Python\ 3.*/Install\ Certifications.command

解决方案 10:

我遇到了同样的问题,无法使用上述答案解决它。我最终通过使用requests.get()解决了这个问题,然后使用结果的.text而不是使用read():

from requests import get

req = get(link)
result = req.text

解决方案 11:

一种简单直接的方法:

from bs4 import BeautifulSoup
import requests

response = requests.get(url)
web_page = response.text

soup = BeautifulSoup(web_page, "html.parser")

解决方案 12:

我为此绞尽了一阵子,最终答案很简单。我检查了响应文本,结果显示“URL 签名已过期”,除非您检查响应文本,否则通常不会看到这条消息。

这意味着某些 URL 会过期,通常是出于安全目的。尝试再次获取 URL 并在脚本中更新 URL。如果您尝试抓取的内容没有新的 URL,那么很遗憾您无法抓取它。

解决方案 13:

打开开发者工具并打开网络分接头。在您想要删除的项目中进行选择,扩展详细信息将包含用户代理并将其添加到那里

解决方案 14:

有时候很多方法都不管用。所以最后一种方法就是获取 Google Cache 的内容。

import requests

# The headers 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0'}

# The URL you want to scrap
url_2_scrap = 'https://www.my_url.com'

# Full URL to get the content 
url_full = 'https://webcache.googleusercontent.com/search?q=cache:' + url_2_scrap

# Response of the request
response = requests.get(url_full, headers=headers)

# If the status is good,
if response.status_code == 200:
    print("OK! It works fine! ;-)")
# If its not good,
else:
    print("It doesn't work :-(")
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用