Selenium + Titanium代理获取请求的接口数据
有一个采集数据的需求,分析了页面数据后发现列表有一个id,但是没有其他数据,打开详情并不是通过id,而是其他一个字段,这就说明通过selenium抓取页面数据还不行,还要接口返回的数据。这个时候就需要用到代理了,在代理层面把数据拦截下来,把自己想要的接口数据保存起来,然后通过页面找到的id去匹配找到详情需要的字段。大致意思就是接口列表返回的数据有id也有详情的字段,但是html里面只有id,所以要把接口数据也存起来,然后根据id找到列表对应的详情字段。
代码如下:
static async Task Main(string[] args) { var proxyServer = new ProxyServer(); proxyServer.AddEndPoint(new ExplicitProxyEndPoint(System.Net.IPAddress.Any, 8000, true)); // 8000为端口 proxyServer.Start(); var proxy = new Proxy { HttpProxy = "127.0.0.1:8000", SslProxy = "127.0.0.1:8000" }; var chromeOptions = new ChromeOptions(); chromeOptions.Proxy = proxy; chromeOptions.AddArgument("--headless"); // 启用无头模式 chromeOptions.AddArgument("--no-sandbox"); // 可选,适用于某些环境 chromeOptions.AddArgument("--disable-dev-shm-usage"); // 可选,适用于某些环 using (var driver = new ChromeDriver( chromeOptions)) { //proxyServer.BeforeRequest+=//返送前的请求request也会在这里拦截 proxyServer.BeforeResponse += async (sender, e) =>//返回的请求都会在这里拦截 { // 检查响应的 Content-Type if (e.HttpClient.Request.Url.Contains("/xxxx") && e.HttpClient.Request.Method == "POST") { Rootobject rootobject = JsonSerializer.Deserialize<Rootobject>(await e.GetResponseBodyAsString()); if (rootobject.data.List != null) { foreach (var item in rootobject.data.List) { Console.WriteLine($"tid:{item.tid}"); } } } }; driver.Navigate().GoToUrl("https://domain.com"); Thread.Sleep(1000); driver.FindElement(By.XPath("/html/body/div/div/div/section/div[3]/div[2]/div/div[1]/img")).Click(); } proxyServer.Stop(); Console.ReadKey(); }
其实也可以直接请求接口,但是直接请求接口的话参数要搞清楚怎么传,这里选择了selenium主要是为了方便,不需要去研究请求参数也不用担心参数变动。selenium本身是支持代理请求的,我们只需要启动一个代理服务器,把代理服务器的地址给到selenium就可以了,这篇文章的代码逻辑也是如此。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!