1. 使用易语言自带的“网页访问支持库”:这是最简单、最直接的方法,适合简单的GET请求。
  2. 使用第三方DLL(如 wininet.dlllibcurl.dll:功能更强大,可以处理复杂的POST请求、设置请求头、上传文件等,但代码相对复杂一些。

下面我将详细介绍这两种方法,并提供完整的示例代码。

易语言写取网页返回数据
(图片来源网络,侵删)

使用易语言自带的“网页访问支持库”

这是最推荐给初学者的方法,因为它封装了底层的复杂性,代码非常简洁。

核心命令

  • 网页访问_取网页源代码 (网址, 超时秒数 = 30, 代理服务器 = "", 代理端口 = 0, 代理用户 = "", 代理密码 = ""):这是最核心的命令,它会向指定网址发送一个GET请求,并返回网页的HTML源代码。
  • 网页访问_取网页状态码 (网址, ...):获取服务器返回的HTTP状态码,200 (成功), 404 (未找到), 500 (服务器内部错误)等。

示例代码:获取百度首页的HTML源代码

这个例子会访问 https://www.baidu.com,并将返回的HTML源代码显示在编辑框中。

.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.局部变量 网页源码, 文本型
' --- 使用默认的GET方法访问百度首页 ---
' 网址: 要访问的URL
' 超时秒数: 设置等待响应的超时时间,这里设为10秒
网页源码 = 网页访问_取网页源代码 ("https://www.baidu.com", 10)
' --- 判断是否成功获取 ---
' 如果获取到的源码不为空,则显示在编辑框中
' 注意:即使服务器返回404错误,此命令也可能返回一个包含错误信息的HTML页面,而不是空文本。
' 更严谨的做法是检查状态码(见方法二)。
判断循环首 (取文本长度 (网页源码) > 0)
    编辑框_内容.内容 = 网页源码
    ' 也可以将源码保存到文件
    ' 写入文件 ("C:\baidu_source.html", 网页源码, , 真)
    跳出循环 ()
判断循环尾 ()
.如果真 (取文本长度 (网页源码) = 0)
    信息框 ("获取网页源码失败,请检查网络连接或网址是否正确!", 0, , )
.如果真结束
.子程序 _按钮_获取数据_被单击
.局部变量 网页源码, 文本型
.局部变量 状态码, 整数型
' 清空编辑框内容 = ""
' --- 获取状态码 ---
状态码 = 网页访问_取网页状态码 ("https://www.baidu.com")
.(状态码 = 200)
    ' 如果状态码是200,表示成功,再获取源码
    网页源码 = 网页访问_取网页源代码 ("https://www.baidu.com")
    编辑框_内容.内容 = 网页源码
.否则
    ' 否则,显示错误信息
    信息框 ("访问失败,服务器返回状态码:" + 到文本 (状态码), 0, , )
.如果结束

代码解释:

  1. __启动窗口_创建完毕事件中,我们直接调用网页访问_取网页源代码来获取百度首页的HTML。
  2. 在按钮的点击事件中,我们演示了更严谨的做法:先取网页状态码,如果状态码是200(成功),才去获取源码并显示,这可以避免将错误页面误认为是成功获取的数据。

使用 wininet.dll (功能更强大)

wininet.dll 是Windows自带的网络相关API,功能比“网页访问支持库”更全面,可以自定义请求头、发送POST数据等。

易语言写取网页返回数据
(图片来源网络,侵删)

核心思路

  1. 使用 InternetOpen 初始化一个会话句柄。
  2. 使用 InternetConnect 连接到指定的服务器。
  3. 使用 HttpOpenRequest 打开一个HTTP请求。
  4. 使用 HttpAddRequestHeaders 添加自定义的请求头(如 User-Agent)。
  5. 使用 HttpSendRequest 发送请求。
  6. 使用 InternetReadFile 循环读取服务器返回的数据。
  7. 使用 InternetCloseHandle 关闭所有打开的句柄,释放资源。

示例代码:使用 wininet.dll 获取网页数据

这个例子同样获取百度首页的HTML,并模拟了一个浏览器请求(通过添加 User-Agent 请求头)。

.版本 2
.程序集 窗口程序集_启动窗口
.子程序 __启动窗口_创建完毕
.子程序 _按钮_获取数据_被单击
.子程序 使用Wininet获取网页, 文本型
.参数 目标网址, 文本型
.参数 请求方法, 文本型, , "GET"  ' 可以是 "GET" 或 "POST"
.参数 POST数据, 文本型, , ""  ' 如果是POST请求,这里填写要发送的数据
.参数 请求头, 文本型, , ""  ' "User-Agent: Mozilla/5.0 ..."
.局部变量 hInternet, 整数型  ' Internet会话句柄
.局部变量 hConnect, 整数型  ' 连接句柄
.局部变量 hRequest, 整数型  ' 请求句柄
.局部变量 返回数据, 文本型
.局部变量 缓冲区, 字节集, 1024  ' 读取数据的缓冲区
.局部变量 读取长度, 整数型
.局部变量 URL分析, 文本型
.局部变量 服务器名, 文本型
.局部变量 对象路径, 文本型
.局部变量 端口号, 整数型
' --- 1. 解析URL ---
URL分析 = 分割文本 (目标网址, "/", , , 假)
.(取文本左边 (URL分析 [1], 7) = "http://")
    服务器名 = 取文本右边 (URL分析 [1], 取文本长度 (URL分析 [1]) - 7)
    端口号 = 80
.否则如果 (取文本左边 (URL分析 [1], 8) = "https://")
    服务器名 = 取文本右边 (URL分析 [1], 取文本长度 (URL分析 [1]) - 8)
    端口号 = 443
.否则
    服务器名 = URL分析 [1]
    端口号 = 80
.如果结束
.计次循环首 (取数组成员数 (URL分析), i)
    .如果真 (i > 1)
        对象路径 = 对象路径 + "/" + URL分析 [i]
    .如果真结束
.计次循环尾 ()
' --- 2. 初始化Wininet ---
' INTERNET_OPEN_TYPE_PRECONFIG = 0, 使用系统默认代理设置
hInternet = InternetOpen ("MyEasyLanguageApp", 0, , , 0)
.(hInternet = 0)
    返回 ("初始化Wininet失败")
    返回 ("")
.如果结束
' --- 3. 连接到服务器 ---
' INTERNET_FLAG_ASYNC = 0x10000000, 同步模式
hConnect = InternetConnect (hInternet, 服务器名, 端口号, , , 3, 0, 0)
.(hConnect = 0)
    InternetCloseHandle (hInternet)
    返回 ("连接服务器失败")
    返回 ("")
.如果结束
' --- 4. 打开HTTP请求 ---
' INTERNET_FLAG_NO_CACHE_WRITE = 0x04000000, 不写入缓存
hRequest = HttpOpenRequest (hConnect, 请求方法, 对象路径, , , , 0x04000000, 0)
.(hRequest = 0)
    InternetCloseHandle (hConnect)
    InternetCloseHandle (hInternet)
    返回 ("打开HTTP请求失败")
    返回 ("")
.如果结束
' --- 5. 添加请求头 ---
.(取文本长度 (请求头) > 0)
    HttpAddRequestHeaders (hRequest, 请求头, -1, &H20000000) ' HTTP_ADDREQ_FLAG_REPLACE
.如果结束
' --- 6. 发送请求 ---
.(取文本长度 (POST数据) > 0 且 大小写比较 (请求方法, "POST") = 0)
    ' 发送POST数据
    HttpSendRequest (hRequest, , 0, POST数据, 取文本长度 (POST数据))
.否则
    ' 发送GET请求
    HttpSendRequest (hRequest, , 0, , 0)
.如果结束
' --- 7. 读取返回数据 ---
.循环判断首 (InternetReadFile (hRequest, 缓冲区, 1024, 读取长度))
    .(读取长度 = 0)
        跳出循环 ()
    .否则
        返回数据 = 返回数据 @ 到文本 (取字节集数据 (缓冲区, 1, 读取长度), , "UTF-8")
    .如果结束
.循环判断尾 ()
' --- 8. 关闭句柄,释放资源 ---
InternetCloseHandle (hRequest)
InternetCloseHandle (hConnect)
InternetCloseHandle (hInternet)
返回 (返回数据)
.子程序 _按钮_获取数据_被单击
.局部变量 网页源码, 文本型
' 自定义请求头,模拟Chrome浏览器
自定义请求头 = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
' 调用我们自定义的子程序
网页源码 = 使用Wininet获取网页 ("https://www.baidu.com", "GET", "", 自定义请求头)
' 显示结果内容 = 网页源码

代码解释:

  1. 使用Wininet获取网页 是一个封装好的子程序,它完成了所有 wininet.dll 的调用步骤,使主程序更简洁。
  2. URL解析wininet 的API需要分开提供服务器名、端口和路径,所以我们需要手动解析完整的URL。
  3. InternetOpen:就像打开浏览器,告诉系统我们要开始上网了。
  4. InternetConnect:连接到百度服务器。
  5. HttpOpenRequest:告诉服务器我们想要访问哪个页面(对象路径)以及用什么方法(GET/POST)。
  6. HttpAddRequestHeaders:添加 User-Agent 等信息,让服务器认为我们是一个正常的浏览器,而不是一个简单的爬虫。
  7. HttpSendRequest:正式发送请求,如果是POST,还会带上POST数据。
  8. InternetReadFile:服务器返回的数据可能很大,所以需要循环读取,直到读取完毕。
  9. InternetCloseHandle:非常重要!关闭所有打开的句柄,避免内存泄漏。

总结与对比

特性 网页访问支持库 wininet.dll
易用性 非常简单,一行代码搞定 复杂,需要理解API和句柄概念
功能 基本GET请求,可设置代理和超时 非常强大,支持GET/POST、自定义请求头、上传文件、HTTPS等
灵活性 低,无法自定义请求头等 ,可以精细控制请求的每一个细节
适用场景 快速获取网页源码、简单的API调用 复杂的网站交互、模拟登录、需要伪装浏览器身份的场景

建议:

  • 如果只是简单抓取一个公开网页的HTML,直接使用方法一,快速高效。
  • 如果需要模拟登录、发送POST表单数据、或者网站有反爬虫机制(需要特定请求头),那么必须使用方法二或更高级的第三方DLL(如 libcurl.dll)。
易语言写取网页返回数据
(图片来源网络,侵删)