批量导入Excel中GSTIN至指定网站,解决Captcha与数据提取难题
批量处理GSTIN电子发票资格查询优化方案
问题背景
需要从Excel批量读取GSTIN(如27AABCC6610Q1ZE、09AAFCS7675H1ZS等,数千条),在指定网站完成查询:
- 自动填入GSTIN
- 若无法自动处理验证码,预留15秒手动输入时间
- 提取并保存查询结果
原代码问题
原代码存在多处逻辑缺陷:
- 用
Shell打开Chrome但后续调用IE对象,两者不兼容 - 未初始化IE浏览器实例
- 循环逻辑错误,未移动到下一个单元格
- 无验证码等待后的确认步骤,未处理结果提取
- 未处理页面加载等待,直接操作DOM会报错
优化后的VBA代码
Sub BatchGSTIN_EInvoiceCheck() Dim IE As Object Dim ws As Worksheet Dim currentRow As Long Dim gstinInput As Object Dim captchaWaitTime As Date Dim resultElements As Object Dim i As Integer ' 初始化工作表和起始行 Set ws = ThisWorkbook.ActiveSheet currentRow = 2 ' GSTIN从A2开始 ' 创建IE实例并打开目标网站 Set IE = CreateObject("InternetExplorer.Application") With IE .Visible = True .Navigate "https://einvoice1.gst.gov.in/Others/EinvEnabled" ' 等待页面加载完成 Do While .Busy Or .ReadyState <> 4 DoEvents Loop End With ' 循环处理每一条GSTIN Do Until ws.Cells(currentRow, 1).Value = "" ' 定位GSTIN输入框并填入数据 Set gstinInput = IE.document.getElementById("GSTIN") If Not gstinInput Is Nothing Then gstinInput.Value = ws.Cells(currentRow, 1).Value Else MsgBox "未找到GSTIN输入框,终止处理", vbCritical IE.Quit Set IE = Nothing Exit Sub End If ' 预留15秒手动输入验证码 captchaWaitTime = Now + TimeValue("00:00:15") MsgBox "请在15秒内输入验证码并点击Next,完成后点击确定继续", vbInformation Do Until Now >= captchaWaitTime DoEvents Loop ' 等待结果页面加载 Do While IE.Busy Or IE.ReadyState <> 4 DoEvents Loop ' 提取结果数据(示例:提取页面关键信息,需根据实际页面结构调整) On Error Resume Next Set resultElements = IE.document.getElementsByTagName("td") If Not resultElements Is Nothing Then ' 将结果写入B列、C列等,根据实际字段调整 For i = 0 To resultElements.Length - 1 Select Case resultElements(i).innerText Case "Legal Name": ws.Cells(currentRow, 2).Value = resultElements(i + 1).innerText Case "E-Invoice Enabled": ws.Cells(currentRow, 3).Value = resultElements(i + 1).innerText Case "Validity Period": ws.Cells(currentRow, 4).Value = resultElements(i + 1).innerText End Select Next i End If On Error GoTo 0 ' 返回查询页面,准备下一条GSTIN IE.Navigate "https://einvoice1.gst.gov.in/Others/EinvEnabled" Do While IE.Busy Or IE.ReadyState <> 4 DoEvents Loop ' 移动到下一行 currentRow = currentRow + 1 Loop ' 清理资源 IE.Quit Set IE = Nothing MsgBox "批量处理完成", vbInformation End Sub
代码说明
- 浏览器实例统一:使用IE对象(若需Chrome可改用Selenium,但VBA原生支持IE更稳定),避免Shell与IE混用的冲突
- 页面加载等待:每次导航后都等待
ReadyState=4确保页面加载完成,防止DOM操作报错 - 验证码处理:通过弹窗提示用户输入,同时设置15秒超时,兼顾手动操作和流程自动化
- 结果提取:根据页面实际HTML结构(示例用表格td元素)提取关键信息并写入Excel对应列,可根据实际页面调整选择器
- 循环逻辑:按行遍历GSTIN,处理完成后自动返回查询页面,无需手动操作
- 错误处理:增加输入框不存在的判断,避免程序崩溃
注意:若网站页面结构更新,需调整DOM元素的定位方式(如getElementById、getElementsByTagName或querySelector)
内容的提问来源于stack exchange,提问作者Leha Jain
相关产品推荐
相关产品推荐

