用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>");

posted @ 2016-03-07 09:35  KMSFan  阅读(382)  评论(0编辑  收藏  举报
document.getElementById("homeTopTitle").innerText="ღKawaii";