html - Excel VBA Web Scraping IE NAVIGATE 方法 Works Vs MSXML2.XMLHTTP60 不工作
问题描述
我正在尝试从 NSE WEB SITE 中提取一个参数,网址是https://www1.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuoteFO.jsp?underlying=INDUSINDBK&instrument=FUTSTK&type=-&strike=-&expiry= 2020 年 4 月 30 日
我可以使用 IE.Navigate(Internet Explorer)方法(打开浏览器并获取数据)来抓取我想要的任何内容,但这需要很长时间,我希望快速提取结果,所以我决定使用“MSXML2.XMLHTTP60”方法,当我尝试时,响应文本,它返回内部服务器错误
下面我给出了我的两个代码,请帮助我在 MSXML2.XMLHTTP60 方法中抓取数据
工作代码,但需要时间
Sub NSE_Data_Pull() Application.EnableEvents = False Application.ScreenUpdating = False Application.DisplayAlerts = False Dim ie As New InternetExplorer Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True ie.navigate "https://www1.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuoteFO.jsp?underlying=INFY&instrument=FUTSTK&type=-&strike=-&expiry=30APR2020#" Do DoEvents Loop Until ie.readyState = READYSTATE_COMPLETE Dim doc As HTMLDocument Set doc = ie.document doc.Focus ActiveSheet.Cells(2, 3) = doc.getElementById("pchangeinOpenInterest").innerText ie.Quit ie.Visible = True Set doc = Nothing Set ie = Nothing Application.DisplayAlerts = True Application.ScreenUpdating = True Application.EnableEvents = True End Sub
仅在此处需要帮助:响应文本返回内部服务器错误 - 快速方法
Sub NSE_Data_Pull() Dim xhr As MSXML2.XMLHTTP60, html As MSHTML.HTMLDocument Set xhr = New MSXML2.XMLHTTP60 Set html = New MSHTML.HTMLDocument With xhr .Open "GET", "https://www1.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuoteFO.jsp?underlying=BEL&instrument=FUTSTK&type=-&strike=-&expiry=30APR2020#", False .send html.body.innerHTML = StrConv(.responseBody, vbUnicode) End With Debug.Print html.body.innerHTML ActiveSheet.Cells(2, 3).Value = html.getElementById("pchangeinOpenInterest").innerHTML End Sub
解决方案
这段代码对我来说运行良好。它同时使用 XMLHTTP 和 MSHTML,因此组件没有副作用:
Sub xxx()
Dim xhr As New MSXML2.XMLHTTP60
Dim html As New MSHTML.HTMLDocument
With xhr
.Open "GET", "https://www1.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuoteFO.jsp?underlying=BEL&instrument=FUTSTK&type=-&strike=-&expiry=30APR2020#", False
.send
'Debug.Print StrConv(.responseBody, vbUnicode)
html.body.innerHTML = StrConv(.responseBody, vbUnicode)
End With
Debug.Print html.body.innerHTML
Set xhr = Nothing
End Sub
可能问题不在 XMLHTTP 上。那里有 HTTP 代理服务器吗?如果 IE 工作但 XMLHTTP 不工作,这意味着 IE 使用 http 代理的系统设置,但 XMLHTTP 没有。所以你应该用你的代理初始化它。它有 setProxy 方法。
顺便说一句,如果对象被声明为新对象,则不必使用 CreateObject 再次对其进行初始化:
Dim ie As New InternetExplorer
Set ie = CreateObject("InternetExplorer.Application")
推荐阅读
- sql - 从特定月份开始的 3 年日期范围
- sql - SQL:获取有序表中组的最小值和最大值
- c# - 如何使用只读用户访问 azure 应用服务的 log4net 日志文件夹
- python - keras 自定义 sigmoid 添加偏差
- python - python中的bigquery API出现问题“AttributeError:'NoneType'对象没有属性'path'”
- python - 制作 3d 和 2d 方程
- php - PHP 将 div 转换为自定义标签
- python - 去除图像中的背景
- sql - 如何在SQL中的给定时间点获得先前时间长度的总数
- typescript - TypeScript:当类型推断正确检测到类型时,显式设置类型是不好的做法吗?