请求协助从代码层面访问集装箱查询网站获取数据
我请求协助从代码层面访问某集装箱查询网站。该网站设有“Container number”输入框,输入编号后点击箭头即可获取对应集装箱的数据。但遗憾的是,页面源码中无可用
IdHTTP1->Get (address)函数加载到程序中的相关数据。我缺乏网站数据读取经验,此前遇到的场景是页面地址包含跳转所需全部数据,但本次网站地址始终不变。

解决方法
这种页面地址不变但能动态加载数据的情况,本质是用了异步请求(AJAX)——数据不是通过页面跳转传递的,而是在后台悄悄发送请求获取的,所以直接Get原页面肯定拿不到查询结果。我给你一步步拆解处理流程:
- 抓包定位真实数据接口
打开浏览器的开发者工具(按F12),切换到「网络」标签页,然后在页面输入集装箱编号点击查询。此时你会看到列表里新增了几个请求,其中一个就是用来获取集装箱数据的核心接口。重点记录这个请求的三个关键信息:
- 请求方式(是GET还是POST)
- 接口的完整URL
- 需要携带的参数(比如集装箱编号对应的参数名,可能是
containerNo或者类似的标识)
- 用IdHTTP模拟请求
根据抓包得到的信息,用IdHTTP来模拟浏览器的请求:
- 如果是GET请求:把参数直接拼接到接口URL末尾,调用
IdHTTP1->Get()方法 - 如果是POST请求:构造参数列表,通过
IdHTTP1->Post()发送
举个Delphi代码示例(假设抓包后发现是POST请求,参数名是containerNumber):
var RequestParams: TStringList; ResponseData: string; begin RequestParams := TStringList.Create; try // 替换成你要查询的集装箱编号 RequestParams.Add('containerNumber=ABC1234567'); // 替换成抓包得到的真实接口地址 ResponseData := IdHTTP1.Post('https://example.com/api/container/query', RequestParams); // 返回的ResponseData可能是JSON或HTML格式,你可以根据需求解析 ShowMessage(ResponseData); finally RequestParams.Free; end; end;
- 模拟浏览器请求头(关键)
很多网站会通过请求头判断访问来源,你需要在IdHTTP的Request属性里设置必要的头信息,让请求看起来像是真实浏览器发起的:
IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'; IdHTTP1.Request.Referer := '原查询页面的URL'; // 替换成你访问的那个集装箱查询页地址
按照这个流程操作,应该就能成功获取到你需要的集装箱数据了。
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

