使用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
相关产品推荐
相关产品推荐

