|
7楼
发表于 2025-6-11 11:28:18
|
只看该作者
浙江省湖州市
### 易语言获取网页数据不一致问题分析与解决方案
从你的描述来看,易语言通过`网页访问_对象()`获取的数据与发包软件返回的不一致,这通常是由于网络请求参数不完整或格式不正确导致的。下面我将详细分析问题原因并提供解决方案。
#### 一、问题原因分析
1. **请求头不完整**:易语言默认的`网页访问_对象()`可能没有包含所有必要的请求头
2. **Cookie处理问题**:手动设置Cookie的方式可能不正确
3. **编码格式差异**:响应内容的编码处理不一致
4. **请求方法错误**:可能需要使用POST方法而非GET
5. **反爬机制影响**:网站可能检测到非浏览器请求并返回不同内容
#### 二、解决方案:使用完整请求头和Cookie
以下是优化后的易语言代码,包含完整的请求头和Cookie处理:
```易语言
.版本 2
.支持库 spec
.支持库 eAPI
.子程序 _按钮1_被单击
.局部变量 网址, 文本型
.局部变量 网页对象, 对象
.局部变量 响应内容, 文本型
.局部变量 请求头, 文本型
.局部变量 Cookie, 文本型
// 设置目标网址
网址 = "https://bscscan.com/address/0xe06e5ce04197dda3e6640cc3a210eee5947af79f"
// 构建完整请求头
请求头 = "Host: bscscan.com" + #换行符 +
"Connection: keep-alive" + #换行符 +
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + #换行符 +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" + #换行符 +
"Accept-Language: zh-CN,zh;q=0.9,ak;q=0.8" + #换行符 +
"Cache-Control: max-age=0" + #换行符 +
"Upgrade-Insecure-Requests: 1" + #换行符 +
"Sec-Fetch-Dest: document" + #换行符 +
"Sec-Fetch-Mode: navigate" + #换行符 +
"Sec-Fetch-Site: none" + #换行符 +
"Sec-Fetch-User: ?1" + #换行符
// 设置完整Cookie
Cookie = "__cflb=02DiuJNoxEYARvg2sN6b3yjRK7ShaYzuKQiNQW7H6y3xx; ASP.NET_SessionId=zziexqdooelnpw4tpd4iqk43; _ga=GA1.1.971342103.1749405645; bscscan_offset_datetime=+8; bscscan_switch_token_amount_value=value; cf_clearance=vHaeEr2yCSVrbSzl3AOnoGKcfxAEXXKmjUFFPcYp4Mo-1749406905-1.2.1.1-Aq8N8kqg1ZP7qfRqNQDnFMHNhT02qIH7VwbbfwSw9AVIgX8U5IUWv7oJhjxu_aZkLLmrhkZLUNMrqIJgd07pZ9KOOM5YBJHtA5lLa45Fss7OQmhmCSazcUNVR2MwU__AekV88KiP8zod.wn8AdVYInn20_M1f5r_aZawWZwnkVPKp.alQkeNJ0dIIYjmfBScx3wURlXPhqkn7KFb5UlYhlJeWMyxzCc.ai3MEXXMrJ5i8dnHeY0TAGae1GUUJwXLaklxn7gLSw5pTrZzlQk1OANdn_PJTty4nZH1xJz2XVs_k41PLd0eNuTjLel_HOr5ly5mFMyEnU6q9lGrDAAkN0Kt2LRjXEvQdrx45rN5xfXIZOQZ6aSc1FBMelvoNg7x; _ga_PQY6J2Q8EP=GS2.1.s1749405645$o1$g1$t1749407254$j60$l0$h0"
// 创建网页访问对象
网页对象.创建 ("WinHttp.WinHttpRequest.5.1", )
// 设置请求头和Cookie
网页对象.写属性 ("RequestHeader", 请求头)
网页对象.写属性 ("AllCookies", Cookie)
// 发送请求
网页对象.方法 ("Open", "GET", 网址, 假)
网页对象.方法 ("Send", )
// 获取响应内容
响应内容 = 网页对象.读属性 ("ResponseText", )
// 显示结果
编辑框1.内容 = 响应内容
调试输出 ("获取内容长度:", 取文本长度 (响应内容))
.子程序尾
```
#### 三、进阶方案:使用精易模块或其他HTTP组件
如果上述方法仍无法解决问题,建议使用功能更完善的模块:
```易语言
.版本 2
.支持库 spec
.支持库 精易模块
.子程序 _按钮1_被单击
.局部变量 网址, 文本型
.局部变量 请求头, 文本型
.局部变量 Cookie, 文本型
.局部变量 响应内容, 文本型
.局部变量 HTTP, 类_HTTP
// 设置目标网址
网址 = "https://bscscan.com/address/0xe06e5ce04197dda3e6640cc3a210eee5947af79f"
// 构建完整请求头
请求头 = "Host: bscscan.com" + #换行符 +
"Connection: keep-alive" + #换行符 +
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" + #换行符 +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" + #换行符 +
"Accept-Language: zh-CN,zh;q=0.9,ak;q=0.8" + #换行符 +
"Cache-Control: max-age=0" + #换行符 +
"Upgrade-Insecure-Requests: 1" + #换行符
// 设置完整Cookie
Cookie = "__cflb=02DiuJNoxEYARvg2sN6b3yjRK7ShaYzuKQiNQW7H6y3xx; ASP.NET_SessionId=zziexqdooelnpw4tpd4iqk43; _ga=GA1.1.971342103.1749405645; bscscan_offset_datetime=+8; bscscan_switch_token_amount_value=value; cf_clearance=vHaeEr2yCSVrbSzl3AOnoGKcfxAEXXKmjUFFPcYp4Mo-1749406905-1.2.1.1-Aq8N8kqg1ZP7qfRqNQDnFMHNhT02qIH7VwbbfwSw9AVIgX8U5IUWv7oJhjxu_aZkLLmrhkZLUNMrqIJgd07pZ9KOOM5YBJHtA5lLa45Fss7OQmhmCSazcUNVR2MwU__AekV88KiP8zod.wn8AdVYInn20_M1f5r_aZawWZwnkVPKp.alQkeNJ0dIIYjmfBScx3wURlXPhqkn7KFb5UlYhlJeWMyxzCc.ai3MEXXMrJ5i8dnHeY0TAGae1GUUJwXLaklxn7gLSw5pTrZzlQk1OANdn_PJTty4nZH1xJz2XVs_k41PLd0eNuTjLel_HOr5ly5mFMyEnU6q9lGrDAAkN0Kt2LRjXEvQdrx45rN5xfXIZOQZ6aSc1FBMelvoNg7x; _ga_PQY6J2Q8EP=GS2.1.s1749405645$o1$g1$t1749407254$j60$l0$h0"
// 创建HTTP对象
HTTP.初始化 ()
// 设置请求头和Cookie
HTTP.添加请求头 ("Host", "bscscan.com")
HTTP.添加请求头 ("Connection", "keep-alive")
HTTP.添加请求头 ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36")
HTTP.添加请求头 ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
HTTP.添加请求头 ("Accept-Language", "zh-CN,zh;q=0.9,ak;q=0.8")
HTTP.添加请求头 ("Cache-Control", "max-age=0")
HTTP.添加请求头 ("Upgrade-Insecure-Requests", "1")
HTTP.设置Cookie (Cookie)
// 发送GET请求
响应内容 = HTTP.GET (网址)
// 显示结果
编辑框1.内容 = 响应内容
调试输出 ("获取内容长度:", 取文本长度 (响应内容))
HTTP.清除 ()
.子程序尾
```
#### 四、高级方案:使用WebBrowser控件模拟浏览器
对于反爬严格的网站,模拟真实浏览器访问是最可靠的方法:
```易语言
.版本 2
.支持库 spec
.子程序 _按钮1_被单击
.局部变量 窗口句柄, 整数型
.局部变量 WebBrowser句柄, 整数型
.局部变量 网址, 文本型
// 设置目标网址
网址 = "https://bscscan.com/address/0xe06e5ce04197dda3e6640cc3a210eee5947af79f"
// 创建窗口并添加WebBrowser控件
窗口句柄 = 创建窗口 ("#32770", "网页访问", 0, 0, 800, 600, 0, 0)
WebBrowser句柄 = 创建窗口 ("WebBrowser", "", 0, 0, 800, 600, 窗口句柄, 1)
// 导航到目标网址
发送消息 (WebBrowser句柄, 0x112, 0x10000, 网址)
// 等待页面加载完成
.局部变量 计时开始, 整数型
计时开始 = 取现行时钟 ()
.循环判断首 (取现行时钟 () - 计时开始 < 10000) // 最多等待10秒
延时 (100)
.如果真 (取窗口标题 (WebBrowser句柄) ≠ "正在打开网页...")
跳出循环
.如果真结束
.循环判断尾 ()
// 获取页面源代码
.局部变量 文档对象, 对象
.局部变量 页面内容, 文本型
文档对象 = 取窗口对象 (WebBrowser句柄, "Document")
.如果真 (文档对象.是否为空 () = 假)
页面内容 = 文档对象.读属性 ("body.innerHTML", )
编辑框1.内容 = 页面内容
.如果真结束
// 关闭窗口
销毁窗口 (窗口句柄)
.子程序尾
```
#### 五、问题排查步骤
1. **检查响应状态码**:在易语言中添加代码获取响应状态码,确认请求是否成功
```易语言
响应状态码 = 网页对象.读属性 ("Status", )
调试输出 ("响应状态码:", 响应状态码)
```
2. **对比请求头**:使用Fiddler或Chrome开发者工具捕获发包软件和易语言的请求,对比差异
3. **测试Cookie有效性**:在浏览器中导入相同Cookie,确认是否能获取正确内容
4. **尝试POST请求**:某些网站GET请求返回不同内容,尝试使用POST请求
5. **添加Referer头**:很多网站需要Referer头来验证请求来源
```易语言
请求头 = 请求头 + "Referer: https://bscscan.com/" + #换行符
```
#### 六、注意事项
1. 网站可能有反爬机制,建议:
- 添加随机请求间隔
- 轮换User-Agent
- 使用代理IP
2. 部分网站使用动态加载内容,需要等待JS执行完成
3. 响应内容可能使用gzip压缩,需要解压缩处理
4. 注意编码问题,确保使用UTF-8编码
通过以上方法,应该能解决易语言获取数据不一致的问题。如果仍有问题,建议提供易语言返回数据和发包软件返回数据的对比示例,以便进一步分析。 |
|