‘壹’ 如何利用VBA来抓取给定链接的网页源代码
1、这个问题相对比较专业。建议再去知乎看看
2、另外咨询下淘宝看看卖VBA程序的人都给出什么方案
3、以下代码转载自网络:
方法1:利用AJAX
Dimhttp
Sethttp=CreateObject("Microsoft.XMLHTTP")
http.Open"POST","连接地址",False
http.send""
Ifhttp.Status=200Then
selection.text=http.responseText
EndIf、
二是开启IE进程
Subtest()
Setie=CreateObject("InternetExplorer.Application")'设置变量
Withie'设置块
.Navigate("需要打开的网页的网址")'打开网页
.Visible=True'是否显示ie窗口
While.readystate<>4'延迟等待页面加载完毕
DoEvents
Wend
Fori=22To49Step3'取数循环
S=S&""&.Document.all.tags("td")(i).innerTEXT'取数据到变量,熟悉HTML的DOM可以修改这个实现各种内容
Nexti
EndWith'块结束
S=LTrim(S)'删除左边空格
Application.SendKeys"^{F4}"'发送按键关闭当前浏览器标签
MsgBoxS'显示结果
Setie=Nothing'释放内存
EndSub
‘贰’ 网页源代码怎么使用
网站源码下载下来后。你新建一个TXT文本文档然后把代码复制进去,再改下后缀名改为html。也就是网页的打开方式,这样你打开他就成为了网页了。但是需要注意的是网页内部代码的图片是地址的,也就是说你打开网页时,代码里的图片是在原来的网站里下载下来的,如果你断开网络连接打开那个网页就会发现图片不见了。 打开网络图片就会回来。 我学的网页制作用的是用的dreamweaver,并且以fireworks,flash辅助,者就是网页制作作俗称的三剑客 dreamweaver是布局表格的也就是做网页,fireworks是文字处理的跟photoshop很像,flash是制作简单动画的。个人认为这都是初级的网页制作软件。。
‘叁’ delphi程序中加入运行程序前检测网络连接的源码
uses WinInet;
// 判断是否连网
function ISInternetConnected():Boolean;
const
MODEM = 1;
LAN = 2;
PROXY = 4;
MODEM_BUSY = 8;
var
dwConnectionTypes:DWORD;
begin
dwConnectionTypes:= MODEM + LAN + PROXY;
Result:=InternetGetConnectedState(@dwConnectionTypes,0);
end;
‘肆’ 是能帮我搞一个宽带连接的易语言源码
.下面是宽带连接的代码。如果不清楚,把邮箱写上我发送给你。
版本 2
.支持库 dp1
.支持库 internet
.支持库 eAPI
.程序集 窗口程序集1
.子程序 __启动窗口_创建完毕
.判断开始 (文件是否存在 (取运行目录 () + “/帐号.ini”))
编辑框2.内容 = 到文本 (读入文件 (取运行目录 () + “/密码.ini”))
编辑框2.内容 = 到文本 (解密数据 (到字节集 (编辑框2.内容), “52cenziyu”, 2))
编辑框1.内容 = 到文本 (读入文件 (取运行目录 () + “/帐号.ini”))
编辑框1.内容 = 到文本 (解密数据 (到字节集 (编辑框1.内容), “52cenziyu”, 2))
.默认
返回 ()
.判断结束
.子程序 _按钮2_被单击
销毁 ()
.子程序 _按钮1_被单击
拨号 (“@0”, 编辑框1.内容, 编辑框2.内容, , )
标题 = “正在连接中”
延时 (3000)
.判断开始 (是否与互联网连接 ())
' 信息框 (“连接成功”, 0, )
' 信息框 (“您的计算机已经成功连接到了互联网”, 0, )
写到文件 (取运行目录 () + “/帐号.ini”, 到字节集 (加密数据 (到字节集 (编辑框1.内容), “52cenziyu”, 2)))
写到文件 (取运行目录 () + “/密码.ini”, 到字节集 (加密数据 (到字节集 (编辑框2.内容), “52cenziyu”, 2)))
' 信息框 (“您的IP为:” + 取IP地址 (), 0, )
销毁 ()
.默认
信息框 (“连接失败,请检查帐号密码是否正确”, 0, )
返回 ()
.判断结束
.子程序 _按钮3_被单击
挂断 ()
‘伍’ 易语言断开本地网络连接源码!
如果是拨号网络连接的话,就只需要一个代码:
挂断 ()
一旦不需要拨号网络连接的话,就可以使用本命令断开。
----------------------------------------------------------
如果不是的话代码如下:
.版本 2
.子程序 _将所有网络连接挂断_被单击
.局部变量 枚举连接, 文本型, , "0"
.局部变量 i, 整数型
.计次循环首 (枚举所有网络连接__已连接的 (枚举连接), i)
设置本地连接 (枚举连接 [i], 假)
.计次循环尾 ()
返回 (假)
.子程序 枚举所有网络连接_已连接的, 整数型, 公开
.参数 网络连接名, 文本型, 参考 可空 数组
.局部变量 size, 整数型
.局部变量 AdapterInfo, IP_ADAPTER_INFO
.局部变量 buf, 字节集
.局部变量 addr, 整数型
.局部变量 i, 整数型
.局部变量 mac, 文本型
.局部变量 tmp, 文本型
.局部变量 Addr_ip, 整数型
.局部变量 buf_ip, IP_ADDR_STRING
.局部变量 size_dns, 整数型
.局部变量 buf_dns, 字节集
.局部变量 dns, IP_PER_ADAPTER_INFO
.局部变量 addr_dns, 整数型
清除数组 (网络连接名)
GetAdaptersInfo ({ 0 }, size)
buf = 取空白字节集 (size)
addr = 取变量地址_字节集 (buf, buf, 0)
.如果真 (GetAdaptersInfo (buf, size) = 0)
.循环判断首 ()
CopyMemory_iai (AdapterInfo, addr, 640)
加入成员 (网络连接名, 取文本注册项 (4, “SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\” + 到文本 (AdapterInfo.AdapterName) + “\Connection\Name”, ))
addr = AdapterInfo.Next
.循环判断尾 (addr ≠ 0)
.如果真结束
返回 (取数组成员数 (网络连接名))
.版本 2
.DLL命令 GetAdaptersInfo, 整数型, "IPHlpApi"
.参数 IpAdapterInfo, 字节集
.参数 pOutBufLen, 整数型, 传址
.DLL命令 GetPerAdapterInfo, 整数型, "IPHlpApi"
.参数 IfIndex, 整数型
.参数 pPerAdapterInfo, 字节集
.参数 pOutBufLen, 整数型, 传址
.DLL命令 Len_iai, 整数型, "kernel32", "LocalSize"
.参数 hMem, IP_ADAPTER_INFO, 传址
.DLL命令 len_ipai, 整数型, , "LocalSize"
.参数 hMem, IP_PER_ADAPTER_INFO, 传址
.DLL命令 Len_ias, 整数型, "kernel32", "LocalSize"
.参数 hMem, IP_ADDR_STRING, 传址
.DLL命令 取变量地址_字节集, 整数型, , "lstrcpynA"
.参数 变量, 字节集, 传址
.参数 变量, 字节集, 传址
.参数 保留, 整数型, , 0
.DLL命令 CopyMemory_iai, , "kernel32", "RtlMoveMemory"
.参数 Destination, IP_ADAPTER_INFO, 传址
.参数 Source, 整数型
.参数 Length, 整数型
.DLL命令 CopyMemory_ipai, , "kernel32", "RtlMoveMemory"
.参数 Destination, IP_PER_ADAPTER_INFO, 传址
.参数 Source, 整数型
.参数 Length, 整数型
.DLL命令 CopyMemory_ias, , "kernel32", "RtlMoveMemory"
.参数 Destination, IP_ADDR_STRING, 传址
.参数 Source, IP_ADDR_STRING
.参数 Length, 整数型
.版本 2
.数据类型 IP_ADAPTER_INFO
.成员 Next, 整数型
.成员 ComboIndex, 整数型
.成员 AdapterName, 字节型, , "260", 名称
.成员 Description, 字节型, , "132", 描述
.成员 AddressLength, 整数型
.成员 Address, 字节型, , "8"
.成员 Index, 整数型
.成员 Type, 整数型, , , 类型
.成员 DhcpEnabled, 整数型
.成员 CurrentIpAddress, 整数型
.成员 IpAddressList, IP_ADDR_STRING
.成员 GatewayList, IP_ADDR_STRING
.成员 DhcpServer, IP_ADDR_STRING
.成员 HaveWins, 逻辑型
.成员 PrimaryWinsServer, IP_ADDR_STRING
.成员 SecondaryWinsServer, IP_ADDR_STRING
.成员 LeaseObtained, 整数型
.成员 LeaseExpires, 整数型
.数据类型 IP_ADDR_STRING
.成员 Next, 整数型
.成员 IpAddress, 字节型, , "16", IP_ADDRESS_STRING
.成员 IpMask, 字节型, , "16", IP_MASK_STRING=IP_ADDRESS_STRING
.成员 Context, 整数型
.数据类型 IP_PER_ADAPTER_INFO
.成员 tmp, 整数型, , "3"
.成员 CurrentDnsServer, IP_ADDR_STRING
.成员 DnsServerList, IP_ADDR_STRING
‘陆’ 如何开发自己的HttpServer-NanoHttpd源码解读
1.能接受HttpRequest并返回HttpResponse
2.满足一个Server的基本特征,能够长时间运行
关于Http协议一般HttpServer都会声明支持Http协议的哪些特性,nanohttpd作为一个轻量级的httpserver只实现了最简单、最常用的功能,不过我们依然可以从中学习很多。
首先看下NanoHttpd类的start函数
[java] view plain
public void start() throws IOException {
myServerSocket = new ServerSocket();
myServerSocket.bind((hostname != null) ? new InetSocketAddress(hostname, myPort) : new InetSocketAddress(myPort));
myThread = new Thread(new Runnable() {
@Override
public void run() {
do {
try {
final Socket finalAccept = myServerSocket.accept();
registerConnection(finalAccept);
finalAccept.setSoTimeout(SOCKET_READ_TIMEOUT);
final InputStream inputStream = finalAccept.getInputStream();
asyncRunner.exec(new Runnable() {
@Override
public void run() {
OutputStream outputStream = null;
try {
outputStream = finalAccept.getOutputStream();
TempFileManager tempFileManager = tempFileManagerFactory.create();
HTTPSession session = new HTTPSession(tempFileManager, inputStream, outputStream, finalAccept.getInetAddress());
while (!finalAccept.isClosed()) {
session.execute();
}
} catch (Exception e) {
// When the socket is closed by the client, we throw our own SocketException
// to break the "keep alive" loop above.
if (!(e instanceof SocketException && "NanoHttpd Shutdown".equals(e.getMessage()))) {
e.printStackTrace();
}
} finally {
safeClose(outputStream);
safeClose(inputStream);
safeClose(finalAccept);
unRegisterConnection(finalAccept);
}
}
});
} catch (IOException e) {
}
} while (!myServerSocket.isClosed());
}
});
myThread.setDaemon(true);
myThread.setName("NanoHttpd Main Listener");
myThread.start();
}
1.创建ServerSocket,bind制定端口
2.创建主线程,主线程负责和client建立连接
3.建立连接后会生成一个runnable对象放入asyncRunner中,asyncRunner.exec会创建一个线程来处理新生成的连接。
4.新线程首先创建了一个HttpSession,然后while(true)的执行httpSession.exec。
这里介绍下HttpSession的概念,HttpSession是java里Session概念的实现,简单来说一个Session就是一次httpClient->httpServer的连接,当连接close后session就结束了,如果没结束则session会一直存在。这点从这里的代码也能看到:如果socket不close或者exec没有抛出异常(异常有可能是client段断开连接)session会一直执行exec方法。
一个HttpSession中存储了一次网络连接中server应该保存的信息,比如:URI,METHOD,PARAMS,HEADERS,COOKIES等。
5.这里accept一个client的socket就创建一个独立线程的server模型是ThreadServer模型,特点是一个connection就会创建一个thread,是比较简单、常见的socket server实现。缺点是在同时处理大量连接时线程切换需要消耗大量的资源,如果有兴趣可以了解更加高效的NIO实现方式。
当获得client的socket后自然要开始处理client发送的httprequest。
Http Request Header的parse:
[plain] view plain
// Read the first 8192 bytes.
// The full header should fit in here.
// Apache's default header limit is 8KB.
// Do NOT assume that a single read will get the entire header at once!
byte[] buf = new byte[BUFSIZE];
splitbyte = 0;
rlen = 0;
{
int read = -1;
try {
read = inputStream.read(buf, 0, BUFSIZE);
} catch (Exception e) {
safeClose(inputStream);
safeClose(outputStream);
throw new SocketException("NanoHttpd Shutdown");
}
if (read == -1) {
// socket was been closed
safeClose(inputStream);
safeClose(outputStream);
throw new SocketException("NanoHttpd Shutdown");
}
while (read > 0) {
rlen += read;
splitbyte = findHeaderEnd(buf, rlen);
if (splitbyte > 0)
break;
read = inputStream.read(buf, rlen, BUFSIZE - rlen);
}
}
1.读取socket数据流的前8192个字节,因为http协议中头部最长为8192
2.通过findHeaderEnd函数找到header数据的截止位置,并把位置保存到splitbyte内。
[java] view plain
if (splitbyte < rlen) {
inputStream.unread(buf, splitbyte, rlen - splitbyte);
}
parms = new HashMap<String, String>();
if(null == headers) {
headers = new HashMap<String, String>();
}
1.http协议规定header和body之间使用两个回车换行分割
1.Http协议第一行是Method URI HTTP_VERSION
2.后面每行都是KEY:VALUE格式的header
3.uri需要经过URIDecode处理后才能使用
4.uri中如果包含?则表示有param,httprequest的param一般表现为:/index.jsp?username=xiaoming&id=2
下面是处理cookie,不过这里cookie的实现较为简单,所以跳过。之后是serve方法,serve方法提供了用户自己实现httpserver具体逻辑的很好接口。在NanoHttpd中的serve方法实现了一个默认的简单处理功能。
[java] view plain
发送response的步骤如下:
1.设置mimeType和Time等内容。
2.创建一个PrintWriter,按照HTTP协议依次开始写入内容
3.第一行是HTTP的返回码
4.然后是content-Type
5.然后是Date时间
6.之后是其他的HTTP Header
7.设置Keep-Alive的Header,Keep-Alive是Http1.1的新特性,作用是让客户端和服务器端之间保持一个长链接。
8.如果客户端指定了ChunkedEncoding则分块发送response,Chunked Encoding是Http1.1的又一新特性。一般在response的body比较大的时候使用,server端会首先发送response的HEADER,然后分块发送response的body,每个分块都由chunk length\r\n和chunk data\r\n组成,最后由一个0\r\n结束。
9.如果没指定ChunkedEncoding则需要指定Content-Length来让客户端指定response的body的size,然后再一直写body直到写完为止。