漳州专业网站建设费用,wordpress 压缩gif插件,企业建站系统下载,鞍山市住房和城乡建设网站有一个采集数据的需求#xff0c;分析了页面数据后发现列表有一个id#xff0c;但是没有其他数据#xff0c;打开详情并不是通过id#xff0c;而是其他一个字段#xff0c;这就说明通过selenium抓取页面数据还不行#xff0c;还要接口返回的数据。这个时候就需要用到代理… 有一个采集数据的需求分析了页面数据后发现列表有一个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-Typeif (e.HttpClient.Request.Url.Contains(/xxxx) e.HttpClient.Request.Method POST){Rootobject rootobject JsonSerializer.DeserializeRootobject(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就可以了这篇文章的代码逻辑也是如此。