You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用VBA的createDocumentFromUrl无法获取目标内容的解决咨询

Fixing createDocumentFromUrl() Issue When Scraping Movie Names from YTS.am

你碰到的"This content cannot be displayed in a frame"提示,本质是目标网站启用了反嵌套防护机制——比如设置了X-Frame-Options响应头来禁止页面被嵌套在iframe里。而createDocumentFromUrl()方法刚好是通过在隐藏iframe中加载页面来生成文档的,直接触发了网站的防护规则,所以拿不到真实的页面内容。

推荐解决方案:改用XMLHTTP直接抓取HTML

最靠谱的替代方案是先用MSXML2.XMLHTTP对象直接获取页面原始HTML,再把内容加载到HTMLDocument里解析。这种方式绕开了iframe的限制,也是VBA网页抓取的标准操作。

这里是修改后的可运行代码:

Sub ScrapeYTSMovies()
    Const URL As String = "https://yts.am/browse-movies"
    Dim xmlHttp As Object
    Dim hdoc As HTMLDocument
    
    ' 创建XMLHTTP对象(用6.0版本兼容性更好)
    Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0")
    
    ' 发送GET请求,模拟浏览器身份避免被拦截
    xmlHttp.Open "GET", URL, False
    xmlHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    xmlHttp.send
    
    ' 检查请求是否成功
    If xmlHttp.Status = 200 Then
        Set hdoc = New HTMLDocument
        hdoc.body.innerHTML = xmlHttp.responseText
        
        ' 解析电影名称(这里用网站实际的类名定位,你可以自己核对调整)
        Dim movieTitles As Object
        Dim title As Object
        
        ' YTS.am的电影标题都在class为"browse-movie-title"的元素里
        Set movieTitles = hdoc.getElementsByClassName("browse-movie-title")
        
        If movieTitles.Length > 0 Then
            Debug.Print "Scraped Movie Titles:"
            For Each title In movieTitles
                Debug.Print title.innerText
            Next title
        Else
            Debug.Print "没找到电影标题,可能是页面结构变了,检查一下选择器哦"
        End If
    Else
        Debug.Print "请求失败,状态码:" & xmlHttp.Status
    End If
    
    ' 清理对象
    Set xmlHttp = Nothing
    Set hdoc = Nothing
End Sub

关键细节说明

  • 为什么放弃createDocumentFromUrl():这个方法的底层实现依赖iframe加载,现在绝大多数网站都有反嵌套防护,基本没法用来抓取正常网站内容了。
  • 设置User-Agent的重要性:很多网站会拦截没有浏览器标识的请求,模拟一个主流浏览器的User-Agent能大幅降低被拦截的概率。
  • 灵活调整选择器:如果后续网站改了页面结构,你可以用浏览器的开发者工具(F12)查看电影标题元素的类名或标签,再修改代码里的选择器。

如果网站是动态加载内容(比如下拉滚动才加载更多电影),XMLHTTP只能拿到初始的静态HTML,这时可能需要用InternetExplorer.Application模拟浏览器加载完整页面,或者尝试Selenium VBA,但YTS.am的浏览页面目前是静态渲染的,上面的代码应该能正常工作。

内容的提问来源于stack exchange,提问作者SIM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:34:24