关闭页面特效

用WebRequest +HtmlAgilityPack 从外网抓取数据到本地

相信大家对于WebRequest 并不陌生,我们在C#中发请求的方式,就是创建一个WebRequest .那么如果我们想发一个请求到外网,比如国内上不了的一些网站,那么该怎么做呢?

其实WebRequest 已经帮我们想好了,WebRequest 独创了Proxy(不知道是不是独有的)模式,以下是部分代码,至于代理IP有兴趣的可以自己去网上搜索。

我这里用的是匿名代理,所以不需要凭据,这点要说明一下,有些代理是要账号名和密码的。

System.Net.WebRequest req = System.Net.WebRequest.Create("http://www.xxx.com"); req.Proxy = new System.Net.WebProxy("127.0.0.1:8024", false); //true means no proxy System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); //Response.Write(sr.ReadToEnd().Trim()); string finalStr=sr.ReadToEnd().Trim();

如果我们能访问外网了,返回了字符串,下一步就可以格式化抓取了,这里我推荐HtmlAgilityPack ,大家可以从Nuget上去下载。

我这里抓取的网页只是个演示而已,我是根据CLASS去抓取,一层一层去抓取,分别抓取CLASS为date >time->title的InnerText

 

下面帖代码,要注意几点:

1.SelectNodes方法可以选择多个节点。

2.如果一个CLASS有多个节点,采用SelectNodes("xxx")[index] 方式去抓取,比如上图。

HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(finalStr); List<string> names = new List<string>(); foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='" + "board_list board_list_type1" + "']")) { int i = 0; foreach (var li in node.SelectNodes("//li[@class='day']")) { string temp=string.Empty; if (li.SelectNodes("//span[@class='date']")[i] != null) { temp = li.SelectNodes("//span[@class='date']")[i].InnerText; } if (li.SelectNodes("//span[@class='time']")[i] != null) { temp += li.SelectNodes("//span[@class='time']")[i].InnerText; } if (li.SelectNodes("//span[@class='title']")[i] != null) { temp+= li.SelectNodes("//span[@class='title']")[i].InnerText; } names.Add(temp); i++; } }

不同的网页有不同的抓取方式,不过大相径庭。最后就是显示出来。

oreach (var name in names) { sb+= name + "<br />"; } Response.Write("<marquee direction=\"up\" behavior=\"scroll\" scrollamount=\"1\" scrolldelay=\"0\" loop=\"-1\" width=\"1000\" height=\"50\" hspace=\"10\" vspace=\"10\">" + sb + "</marquee>");


__EOF__

作  者ღKawaii
出  处https://www.cnblogs.com/kmsfan/p/5249466.html
关于博主:一个普通的小码农,为了梦想奋斗
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   yangliwen  阅读(384)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
0
0
关注
跳至底部
document.getElementById("homeTopTitle").innerText="ღKawaii";
点击右上角即可分享
微信分享提示