我有一个在 Firefox 上运行的 URL 设置为阻止所有 cookie 并关闭了 JavaScript,但是当我用
urllib
在 Python 上抓取它时,我得到 HTTP Error 403: Forbidden
。我使用与 Firefox 相同的用户代理,这是我的代码:
import urllib
import urllib.request
USER_AGENT_KEY = "User-Agent"
USER_AGENT_VALUE = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/111.0'
def get_page(url)
req = urllib.request.Request(url)
req.add_header(USER_AGENT_KEY, USER_AGENT_VALUE)
# Empty SSL context, only for public websites, don't use this for banks or anything with a sign-in!
response = urllib.request.urlopen(req, context = ssl.SSLContext(), timeout = TIMEOUT)
data = response.read()
html = data.decode('utf-8')
return html # Returns "HTTP Error 403: Forbidden"
除了 JavaScript、cookies 或用户代理之外,我不知道网站有什么机制来检测用户。如果相关,一个 URL 是
https://www.idealista.pt/comprar-casas/alcobaca/alcobaca-e-vestiaria/com-preco-max_260000,apenas-apartamentos,duplex/
.
这个网站如何检测到刮板?
提供的网址是一个动态网站,似乎使用了 React 或其他类似的 JS 框架。如果没有 javascript,该站点将无法运行。当您使用
curl
下载页面时,您会看到您必须启用 javascript。
这意味着,您不会仅通过下载 html 页面获得任何有用的信息。
你得到 403 的原因是该页面嵌入了一个从 https://geo.captcha-delivery.com/ 返回 403 的脚本。我不能说这个脚本是关于什么的,但它似乎是一些一种地理封锁 api,由于缺少一些信息而阻止您的请求。
使用 urllib / requests 进行网络抓取是不可靠的。即使您能够在不被检测到的情况下加载页面,某些网站也会在之后使用 JavaScript 加载数据。解决这个问题的一个好方法是使用 Selenium WebDriver 或 Playwright。这两种工具都允许您模拟网络浏览器并与页面交互,就好像您是真实用户一样。