C#+Selenium抓取百度搜索结果前100网址
需求
爬取百度搜索某个关键字对应的前一百个网址。
实现方式
VS2017 + Chrome
.NET Framework + C# + Selenium(浏览器自动化测试框架)
环境准备
创建控制台应用程序,通过NuGet添加对Selenium的引用
这里因为我用的Google浏览器,所以添加这两个的引用。
代码输出
1 static void GrabUrlByKeyWord(string keyWord) 2 { 3 //创建chrome驱动程序 4 IWebDriver webDriver = new ChromeDriver(); 5 //跳至百度 6 webDriver.Navigate().GoToUrl("https://www.baidu.com"); 7 //找到页面上的搜索框 输入关键字 8 webDriver.FindElement(By.Id("kw")).SendKeys(keyWord); 9 //点击搜索按钮 10 webDriver.FindElement(By.Id("su")).Click(); 11 }
运行看一下效果先
1 static void Main(string[] args) 2 { 3 GrabUrlByKeyWord("香香瓜子"); 4 }
是不是感觉太简单了,这么快就来到目标页面了(这么想就太天真了。。)
F12,观察发现搜索结果都在一个id为content_left的div中,进一步解刨
百度对目标做了中转,最关键的是它对目标url做了加密。。。
那么?问题来了,我们怎么获取到目标真实的网址呢?
当然,方法有很多:
①可以通过Selenium模拟真实操作,每个结果都点进去,获取地址栏的网址;(这样效率是不是太低了。。。)
②解密;(目前我还没有找到解密方法。。。)
③后台通过HttpClient发送请求,获取url;
......
......
......
把想说的思想总结一下:
使用HttpClient一个一个去请求的地址来获取真实地址的话,这样效率很低,
使用PLINQ并行查询 或 多线程 的话,效率变高了,但是它的执行顺序是不定的,
我们需要的结果又是排名的顺序,这时候可以把操作对象封装成不依赖顺序的model,
例如给model加一个rank排名属性,后期可以根据该属性进行处理。
贴一段来自Microsoft的文本:
虽然可以指示 PLINQ 暂留任何源序列的顺序,但这会对性能产生不利影响。 最佳做法是,尽量将查询的结构设计为不依赖顺序暂留。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构