使用excel VBA从URL获取股票列表
我想从以下站点下载一个文件到我的本地工作表: 下面是我的代码,我做了一些研究后尝试。 挑战是,如何避免页面重新提交(重试,取消警告窗口) 其次,我需要下载5mb文件并解压缩到当前的localworksheet使用excel VBA从URL获取股票列表,excel,vba,web-scraping,Excel,Vba,Web Scraping,我想从以下站点下载一个文件到我的本地工作表: 下面是我的代码,我做了一些研究后尝试。 挑战是,如何避免页面重新提交(重试,取消警告窗口) 其次,我需要下载5mb文件并解压缩到当前的localworksheet Sub bsecode() Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") With ie ie.Visible = True 'To open the website .navigate "ht
Sub bsecode()
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
With ie
ie.Visible = True
'To open the website
.navigate "https://www.bseindia.com/corporates/List_Scrips.aspx#"
Do While ie.readyState <> 4
Sleep 1000
Loop
ie.document.getElementsByName("ctl00$ContentPlaceHolder1$btnSubmit")(0).Click
Sleep 1000
Do While ie.readyState <> 4
Sleep 1000
Loop
'To download the file
ie.navigate "javascript:__doPostBack('ctl00$ContentPlaceHolder1$lnkDownload','')"
'Do While .Busy: DoEvents: Loop
End With
End Sub
子bsecode()
模糊的物体
设置ie=CreateObject(“InternetExplorer.Application”)
与ie
可见=真实
"打开网站,
.导航“https://www.bseindia.com/corporates/List_Scrips.aspx#"
请稍等,即readyState 4
睡1000
环
ie.document.getElementsByName(“ctl00$ContentPlaceholder 1$btnSubmit”)(0)。单击
睡1000
请稍等,即readyState 4
睡1000
环
'下载该文件
ie.navigate“javascript:_doPostBack('ctl00$ContentPlaceholder 1$lnkDownload','')
'请稍候。忙碌:DoEvents:循环
以
端接头
我不喜欢sendkeys,但下面的方法很有效
Option Explicit
'VBE > Tools > References:
' Microsoft Internet Controls
Public Sub GetData()
Dim ie As New InternetExplorer
With ie
.Visible = True
.Navigate2 "https://www.bseindia.com/corporates/List_Scrips.aspx#"
While .Busy Or .readyState < 4: DoEvents: Wend
With .document
'status
.querySelector("[value='Active']").Selected = True 'Suspended,Delisted,Select
'group
.querySelector("[value='Select']").Selected = True ' "B ", "C " etc
'industry
.querySelector("[value='Advertising & Media']").Selected = True 'Agrochemicals etc
'segment
.querySelector("#ContentPlaceHolder1_ddSegment [value='Equity']").Selected = True
'Submit
.querySelector("#ContentPlaceHolder1_btnSubmit").Click
Const MAX_WAIT_SEC As Long = 5
Dim t As Date
While ie.Busy Or ie.readyState < 4: DoEvents: Wend
Dim download As Object
t = Timer
Do
On Error Resume Next
Set download = .querySelector("#ContentPlaceHolder1_lnkDownload")
On Error GoTo 0
If Timer - t > MAX_WAIT_SEC Then Exit Do
Loop While download Is Nothing
If Not download Is Nothing Then
download.Click
End If
Application.Wait Now + TimeSerial(0, 0, 10)
Application.SendKeys "%N", True
Application.SendKeys "%S", True
Application.Wait Now + TimeSerial(0, 0, 10)
Application.SendKeys "%O", True
End With
Stop
.Quit
End With
End Sub
YPU能为我提供一些选择吗?你会考虑使用IE或硒基铬吗?嗨,QHarr,刚刚编辑的帖子,请建议。我正在尝试将文件直接获取到当前工作表。我很抱歉我是vba新手…我一直在看它。有一个问题我仍然需要用当前的解决方案来解决。非常感谢@QHarr,我也在从我这边尝试。但是作为一个初学者,我正在向你这样的人学习。很抱歉耽搁了。我更喜欢selenium方法,原因很明显。np,非常感谢@QHarr,事实上我无法使用互联网,也无法浏览几天来测试代码。希望上面的代码也能将数据复制到当前工作表中。是的,两种解决方案都在工作,并弹出窗口下载文件,但可以帮助我如何将下载的文件复制到现有工作簿。顺便说一句,很抱歉延迟回复。我想问一个后续问题。我会考虑的事情是:1)如果我能在下载之前捕获文件名,使用它来定位下载中的文件,打开并传输数据,或者2)对下载文件夹中的文件进行计数,当数量增加1(因为新文件已下载)时,抓取最新文件(修改日期)并打开并传输数据。上面写的太多了。我以前也写过类似的答案。文件名总是ListOfScrips.csv,@QHarr,但如果我们下载多个文件,它会像ListOfScrips(1.csv.)等等。。
Option Explicit
Public Sub MakeSelections()
Dim d As WebDriver
Set d = New ChromeDriver
Const URL = "https://www.bseindia.com/corporates/List_Scrips.aspx#"
With d
.Start "Chrome"
.get URL
'status
.FindElementByCss("#ContentPlaceHolder1_ddlStatus").AsSelect.SelectByText "Suspended"
'group
.FindElementByCss("#ContentPlaceHolder1_ddlGroup").AsSelect.SelectByText "Select" ' "B ", "C " etc
'industry
.FindElementByCss("#ContentPlaceHolder1_ddlIndustry").AsSelect.SelectByText "Agrochemicals" 'Agrochemicals etc
'segment
.FindElementByCss("#ContentPlaceHolder1_ddSegment").AsSelect.SelectByText "Equity"
.FindElementByCss("#ContentPlaceHolder1_btnSubmit").Click
.FindElementByCss("#ContentPlaceHolder1_lnkDownload").Click
.Quit
End With
End Sub