使用excel VBA从URL获取股票列表

使用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

我想从以下站点下载一个文件到我的本地工作表: 下面是我的代码,我做了一些研究后尝试。 挑战是,如何避免页面重新提交(重试,取消警告窗口) 其次,我需要下载5mb文件并解压缩到当前的localworksheet

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