Python3Web 抓取中的问题 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
272277 次浏览

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

这对我有用。

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

提示: 因为这是一个练习,选择一个不同的,非限制性的网站。也许他们正在阻止 urllib的某些原因..。

由于页面在浏览器中工作,而不是在 python 程序中调用,所以似乎提供 网址服务的 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

尝试发布头’用户-代理’的 假的网络客户端。

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

肯定是因为您使用了基于用户代理的 urllib,所以阻塞了。同样的事情也发生在我身上。您可以创建一个名为 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或类似的服务器安全特性阻塞了已知的

蜘蛛/机器人

User agent (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。 因此,需要使用 decode 方法对 Web _ byte进行解码。

这解决了我在使用 PyCharm 从一个网站尝试 刮伤时的完整问题

附注-> 我使用 python 3.4

您可以尝试两种方法。细节在这个 链接中。

1)经匹普

Pip 安装——升级证书

2)如果它不起作用,尝试运行一个与 Python3捆绑的 证明,命令。* for Mac: (转到 python 安装位置,双击该文件)

Open/Applications/Python3. */Install Cericates.command 打开/应用程序/Python 3. */安装证书

If you feel guilty about faking the user-agent as Mozilla (comment in the top answer from Stefano), it could work with a non-urllib User-Agent as well. This worked for the sites I reference:

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

我的应用程序是通过抓取我在文章中提到的特定链接来测试有效性。不是普通刮刀。

基于以前的答案,我在 Python 3.7中将超时时间增加到10。

from urllib.request import Request, urlopen


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


print(webpage)

向请求标头添加 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)

我遇到了同样的问题,但是不能用上面的答案来解决它。我最终通过使用 requests.get ()和使用。而不是使用 read () :

from requests import get


req = get(link)
result = req.text

你可以这样使用 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'),\
('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")

我用这个扯了一会儿头发,结果答案非常简单。我检查了回复文本,我得到了“ URL 签名过期”,这是一个消息,你通常不会看到,除非你检查回复文本。

这意味着一些 URL 会过期,通常是出于安全目的。尝试再次获取 URL 并更新脚本中的 URL。如果您试图搜集的内容没有新的 URL,那么不幸的是,您无法搜集它。