如何实现net网络爬虫 或者网络抓取呢

去返网 2010-04-15 04:48:32
我想问下:利用net 开发实现网络爬虫或者网络抓取,怎么实现呢?最好有代码可提供 谢谢了
...全文
1358 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wazex819 2011-09-03
  • 打赏
  • 举报
回复
好贴,强顶!
newdigitime 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zzxap 的回复:]
只是这样一个蜘蛛程序怕是效率万般低下,因为它只有一个线程,光解析下一层的链接都要花上不少时间,怎么办呢?当然是采取更优化的办法:多线程[/Quote]

何不把如何做多线程抓取的基本代码放出来?
porschev 2010-04-15
  • 打赏
  • 举报
回复
抓取也简单...

先抓下全部页面...找页面规律

正规匹配...再一步步replace替换...

得到你想要的数据..存入数据库
zzxap 2010-04-15
  • 打赏
  • 举报
回复
爬虫,又称蜘蛛,是从别的网站抓取资源的一种方法,C#.NET使用爬虫的方法如下:
protected string GetPageHtml(string url)
{
string pageinfo;
try
{
WebRequest myreq = WebRequest.Create(url);
WebResponse myrep = myreq.GetResponse();
StreamReader reader = new StreamReader(myrep.GetResponseStream(), Encoding.GetEncoding("gb2312"));
pageinfo = reader.ReadToEnd();
}
catch
{
pageinfo = "";
}
return pageinfo;
}
按上述方法就可以在程序中获取某URL的页面源文件。
但是有些网站屏蔽了爬虫,那就需要模拟浏览器获取的方法来进行,具体代码如下:
protected string GetPageHtml(string url)
{
string pageinfo;
try
{
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(url);
myReq.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
myReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
HttpWebResponse myRep = (HttpWebResponse)myReq.GetResponse();
Stream myStream = myRep.GetResponseStream();
StreamReader sr = new StreamReader(myStream, Encoding.Default);
pageinfo = sr.ReadToEnd().ToString();
}
catch
{
pageinfo = "";
}
return pageinfo;
}
zzxap 2010-04-15
  • 打赏
  • 举报
回复
问题是对某一网站或所有网站进行抓取,即下载所有网页。怎么实现呢?
先将问题最小化(转化的思想,转化为小规模,可以解决的问题):如果只有一个网页,怎么下载?问题变地很简单,只要用WebClient/WebRequest(甚至OpenFileDialog都可以)打开Url地址,将数据流存入本地存储器的文件(以相应的扩展名作为扩展名)即可。示例代码如下:
string BoardStream;//下载内容存入此变量
Uri url = new Uri( “http://www.163.com” );//将下载地址转换为Uri类型
HttpWebRequest requestPage = ( HttpWebRequest )WebRequest.Create( url );
WebResponse response = requestMainPage.GetResponse();
Stream stream = response.GetResponseStream();//获取页面流
if( response.ContentType.ToLower().StartsWith( "text/" ) )//如果获得成功(即为文本格式)
{
StreamReader reader = new StreamReader( stream , System.Text.Encoding.UTF8 );//读取获得内容流
BoardStream = reader.ReadToEnd();//将内容流转换为文本并存入变量BoardStream,即为所需要的数据流
}
StreamWriter saveAPage = new StreamWriter( “C:\a.html” , false , System.Text.Encoding.GetEncoding( "gb2312" ) );//实例化写入类,保存路径假设为C:\a.html
saveAPage.Write(Rich.Text);//创建写入任务
saveAPage.Flush();//写入文件(即清理缓存流)
saveAPage.Close();//关闭写入类的对象
好了,这样便完成了一个网页的下载。最简化问题解决!

好了,下面的问题是,如何获得更多的网页?可以分两步:
1. 得到更多的地址
2. 下载地址指向的链接内容(和上面下载一页的方法一样)
循环进行上面两步即可以完成蜘蛛的全部功能了 ^_^
要得到更多的地址,最好的办法是模拟人使用网页的办法。我们平时怎么浏览整个网站?无非是从主页依次点开各层链接而已。好了,思路出来了:
分析已经下载的主页文本,提取其中所有的Url地址信息,再依次下载得到的Url地址指向的链接即可。
现在网络上有不少Web2.0的网站了,这对解析Url地址有不小的负面作用。在Web2.0出现前,所有的链接都是在HREF后面出现的,而现在却没有了这样的关键字,地址可能出现于任何的关键字之后。怎么办呢?
经过大量分析,笔者发现:其实现在所有的链接还有一个共性,即都包裹在双引号(””)当中,这便对解析提供了极大的方便。笔者将链接分为两类:
1. 完整链接,即:”http://www.163.com”类,其前面有明显的标志http://,这样的内容很好提取,只要用String的静态方法IndexOf()找出http://的位置以及从此位置算起第一个“””出现的位置(即链接结束的位置),再用SubString()方法将地址提取出来即可。
2. 非完整链接,其形式一般为”\index.htm”,提取方法和完整链接的方法相同,只是判断它是不是链接上有一定难度(因为属性等其它信息也可能以“”\”开头,这时就很难判断了。笔者采取的方法是试下载,即下载一下试试,如果超时刚不是,不超时刚是。注意:要在它的前面加上根地址,如“http://www.163.com/index.htm”。

好了,我想蜘蛛的所有功能已经实现了吧?嘿嘿^_^
只是这样一个蜘蛛程序怕是效率万般低下,因为它只有一个线程,光解析下一层的链接都要花上不少时间,怎么办呢?当然是采取更优化的办法:多线程
zzxap 2010-04-15
  • 打赏
  • 举报
回复
爬虫的道理很简单,但是想要做一个比较好的爬虫就会很难的,要考虑很多诸如时间和空间上的问题,和考虑的算法;

老毕同学写过一个,很不错,自己没事也写一个。很是简陋。我们要考虑的无非就是怎样把网页下载下来,然后怎样从网页中取出有效的地址,我们可以设置一个队列把新得到的地址放入队列的尾部。从队列中取出,不断的进行循环,也就是采用广度优先的搜索算法。不断的进行下去。道理明白了下面就是实现了。

首先是获得网页文件:

public string getPageHtml(string url)
{
Uri uri = new Uri(url);
HttpWebRequest hwReq = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse hwRes = (HttpWebResponse)hwReq.GetResponse();

hwReq.Method = "Get";

hwReq.KeepAlive = false;

StreamReader reader = new StreamReader(hwRes.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312"));

return reader.ReadToEnd();
}

第二从文件中读取连接:

public ArrayList GetHyperLinks(string htmlCode)
{
ArrayList al = new ArrayList();

string strRegex = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";

Regex r = new Regex(strRegex, RegexOptions.IgnoreCase);
MatchCollection m = r.Matches(htmlCode);

for (int i = 0; i <= m.Count - 1; i++)
{
bool rep = false;
string strNew = m[i].ToString();

// 过滤重复的URL
foreach (string str in al)
{
if (strNew == str)
{
rep = true;
break;
}
}

if (!rep) al.Add(strNew);
}

al.Sort();

return al;
}

有了这两项基本的已经实现,其它代码不便公布

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧