谁会使用WinHttp组件。帮我把需要的功能套进去
vb吧
全部回复
仅看楼主
level 4
我想从
https://www.ldoceonline.com/
这里拿到一个单词是怎么划分音节的,可以知道在IP地址后面就能实现单词的输入,例如查询“apple”这个单词的IP地址是
https://www.ldoceonline.com/dictionary/apple
在网上查到使用WinHttp组件的代码如下:
''使用WinHttp组件,发送Https请求
'' C:\WINDOWS\system32\WINHTTP.dll
'' Microsoft WinHTTP Services, version 5.1
Sub Main()
Dim aHttpRequest As WinHttp.WinHttpRequest
Dim sUrl As String
Dim sMethod As String
Dim sBody As String
Dim sResponse As String
sBody = "你的请求内容"
sUrl = "你的请求地址" '如 "https//xxxx:12306/yyyy"
sMethod = "POST" '或者(GET)
''创建WinHttp.WinHttpRequest
Set aHttpRequest = CreateObject("WinHttp.WinHttpRequest.5.1")
'' 同步接收数据
aHttpRequest.open sMethod, sUrl, False
'' 非常重要(忽略错误)
aHttpRequest.Option(WinHttpRequestOption_SslErrorIgnoreFlags) = &H3300
'' 其它请求头设置
'aHttpRequest.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
'aHttpRequest.setRequestHeader "Content-Length", Len(sBody)
'' 发送
aHttpRequest.send sBody
'' 得到返回文本(或者是其它)
sResponse = aHttpRequest.responseText
Debug.Print sResponse
Set aHttpRequest = Nothing
End Sub
我只想拿到这段划分了音节的单词和音标!
我不知道sBody 应该怎么赋值,应该从哪里查到。哪位大侠帮忙把这段代码写出来,多谢了!
2020年10月27日 08点10分 1
level 12
这个自己没底子只能花钱定制,好像并不是获取一个网页源码这么简单。
2020年10月28日 07点10分 3
level 10
直接可以通过网页抓取就行,然后分析网页元素,去掉无关描述。
由于VB text 无法显示音标之类的,用web替代了,下面给出分析代码,通过最简单的字符串提取。
Option Explicit
Dim WithEvents objWeb As VBControlExtender
Private Sub Command1_Click()
Dim a$, i%, j%
a = GetPage$("https://www.ldoceonline.com/dictionary/" & LCase(Text1), "utf-8") '//需要转成小写
'Debug.Print a
i = InStr(a, "Related topics:") '//class="PRON"
j = InStr(a, "noun")
If i > 0 And j > 0 Then
Dim aq$, eg$, aw%, ae%
'//缩小源码范围
aq = Mid(a, i, j - i)
'//获取ap?ple
aw = InStr(aq, "HYPHENATION")
ae = InStr(aw + 3, aq, "</")
'//提取1
eg = Mid(aq, aw + 13, ae - aw - 13)
'//提取音标
Dim yq%, yw%, ye$
yq = InStr(aq, """PRON""")
yw = InStr(aq, "tooltip LEVEL")
ye = Mid(aq, yq + 6, yw - yq - 6)
'//剔除无用部分
ye = Replace(ye, "class=""i""", "")
ye = Replace(ye, "span", "")
ye = Replace(ye, "=", "")
ye = Replace(ye, "span", "")
ye = Replace(ye, "class", "")
ye = Replace(ye, ">", "")
ye = Replace(ye, """", "") 'neutral
ye = Replace(ye, "neutral", "")
ye = Replace(ye, "</", "")
ye = Replace(ye, "<", "")
ye = Replace(ye, " ", "")
ye = Replace(ye, "AMEVARPRON", "") '//部分存在,也需要剔除
ye = "/" & ye
objWeb.object.Document.writeln ye & " " & eg
Debug.Print ye
objWeb.Visible = True
Else
MsgBox "Null"
End If
End Sub
Private Sub Form_Load()
Licenses.Add "Shell.Explorer.2", "Shell.Explorer.2" '填加许可证
Set objWeb = Controls.Add("Shell.Explorer.2", "myctl", Me) '填加控件
objWeb.Move 100, 1000, Me.ScaleWidth - 200, 1000
objWeb.Visible = False
objWeb.object.Navigate ""
Command1.Caption = "查询"
Text1 = "apple"
End Sub
Public Function GetPage$(ByVal url$, ByVal code$) '//获取网络源码
Dim stime, ntime
On Error Resume Next
Dim Retrieval As Object
Set Retrieval = Nothing
Set Retrieval = CreateObject("Microsoft.XMLHTTP") '//WinHttp.WinHttpRequest.5.1
With Retrieval
.Open "Get", url, True, "", ""
.setRequestHeader "If-Modified-Since", "0"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Connection", "close"
.send
stime = Now
While .ReadyState <> 4
DoEvents
ntime = Now
If DateDiff("s", stime, ntime) >= 3 Then GetPage = "": Set Retrieval = Nothing: Exit Function '判断超出3秒即超时退出过程
Wend
GetPage = code$(.ResponseBody, code)
End With
Set Retrieval = Nothing
End Function
Function code$(ByVal body, code$) '// 编码
Dim ObjStream
Set ObjStream = CreateObject("adodb.stream")
'If body = "" Then Exit Function
With ObjStream
.Type = 1
.Mode = 3
.Open
.Write body
.Position = 0
.Type = 2
.Charset = code
BM = ObjStream.ReadText
.Close
End With
Set ObjStream = Nothing
End Function
2020年10月29日 07点10分 4
非常感谢你的帮助!有时间可以再帮我看一下缺少数组这个错误是怎么回事?
2020年10月31日 11点10分
由于我水平实在有限,那个缺少数组的错误始终没有调试明白,希望你能把你做的原文件发一下给我。 邮箱: [email protected] 万分感谢!
2020年11月01日 14点11分
@最柔软的心灵 是改的代码问题,函数和变量重名了,改好的发你邮箱了
2020年11月02日 04点11分
@贴吧用户_02EJyXU 你发过来的 在我这里运行的结果还是不行,Retrieval.ResponseBody是空值,底下我截图了
2020年11月02日 12点11分
吧务
level 12
有一个很暴力的方法:获取网页源代码,获取出现第n个div的位置
2020年10月30日 14点10分 5
level 4
我的电脑是64位 win7 专业版
也尝试了让程序在进入codeA$函数之前多等待一会儿,但是在进入codeA$函数时,Retrieval.ResponseBody 所传递过去的还是个空值!这是什么原因?
我添加了两个debug.print输出,
一个是在
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
之后
Debug.Print TypeName(Retrieval)
结果返回:IXMLHTTPRequest
一个是进入codeA$函数之后
Debug.Print Len(body)
结果返回:0
2020年11月02日 12点11分 8
我这边都是OK 的,运行没有问题(win10)。你把 获取网页源码中,.setRequestHeader 三行注释掉运行试试 。
2020年11月02日 13点11分
@贴吧用户_02EJyXU 我试验用你给的程序访问百度,就可以拿到网页的HTML代码,但是访问https://www.ldoceonline.com/就不行。也不知道是什么原因
2020年11月05日 06点11分
提示的信息是: 实时错误 -2147012866(80072efe) 与服务器的连接意外终止
2020年11月05日 06点11分
吧务
level 13
发你QQ了
2020年11月09日 01点11分 11
吧务
level 13
'添加一个Webbrowser,一个Textbox,一个CommandButton
Private Sub Command1_Click()
GetSyllable Text1
End Sub
Sub GetSyllable(ByVal Text As String)
On Error Resume Next
Dim obj, GetText As String, t As String, e As Integer
Set obj = Nothing
Set obj = CreateObject("Microsoft.XMLHTTP")
obj.Open "GET", "https://www.ldoceonline.com/dictionary/" & Text, False
obj.send
GetText = obj.responsetext
Set obj = Nothing
Set Document = CreateObject("HTMLFILE")
Document.designMode = "On"
Document.write GetText
e = 0
For Each a In Document.getelementsbytagname("SPAN")
If a.classname = "HYPHENATION" Then
t = a.innertext
ElseIf a.classname = "PronCodes" Then
e = 1
WebBrowser1.Document.body.innertext = t & " " & a.innertext
Exit For
End If
Next
If e = 0 Then WebBrowser1.Document.body.innertext = "无结果"
End Sub
Private Sub Form_Load()
WebBrowser1.Navigate "about:blank"
End Sub
2020年11月09日 01点11分 12
我发现访问百度https://www.baidu.com这个加密协议的网址时,会跳转到http://www.baidu.com这个非加密协议网址,并且拿到的也是非加密协议网址指向的HTML源文件
2020年11月09日 07点11分
level 4
还是不行,执行到断点时,GetText还是等于空值,我把那个网址替换成百度的网址,就能在立即窗口输出百度的网页源代码。
2020年11月09日 06点11分 13
level 4
在你们那都好使,不知道为什么在我这就不行
2020年11月09日 07点11分 14
level 4
感谢@贴吧用户_02EJyXU@…烟花飘飘… 的帮助!今天终于搞明白了,是我电脑上IE浏览器的版本太低,升级以后就OK了。
2020年11月26日 01点11分 16
1