C# 多线程爬虫爬取网页问题

weixinyaojinNUS 2013-04-04 08:50:22
string ans = "";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.ContentType = "text/html";
request.Method = "GET";
HttpWebResponse res;
Stream st;
StreamReader sr=null;
Encoding toword;
try
{
res = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
res = (HttpWebResponse)ex.Response;
}

if (res.ToString() == null)
return ans;
st = res.GetResponseStream();
toword = null;
if (!encode.ToUpper().Equals("UTF8"))
{
toword = Encoding.GetEncoding(encode);
}
else
{
toword = Encoding.UTF8;
}

try
{
sr = new StreamReader(st, toword);
ans = sr.ReadToEnd();
sr.Close();
st.Close();
}
catch (WebException ex)
{
Console.WriteLine(ex.ToString());
sr.Close();
st.Close();
}
return ans;
用C#写的多线程爬虫,主要是用了HttpWebRequest和HttpWebResponse做的,在运行过程中,设定5个爬虫,爬取某网站上10000个网页,开始没有问题,但是运行一段时间后报这样的异常:System.IO.IOException 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接 ---> System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
在 System.Net.Sockets.NetworkStream.Read--- 内部异常堆栈跟踪的结尾 ---
在 System.IO.StreamReader.ReadToEnd()
有的时候可以成功爬取6000多个网页,有时候几百个就报这个异常,在网上看了很多解决方案都不行啊,我看的方法有:1,把getResponse方法放到Try。。。catch块里面去; 2.把防火墙关掉 但是都不行,我怀疑是长时间爬取一个网站,被它服务器的安全措施给拒绝连接了。
...全文
381 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixinyaojinNUS 2013-04-07
  • 打赏
  • 举报
回复
引用 5 楼 winner2050 的回复:
网络报错不属于程序逻辑异常,应该用try给屏蔽掉异常信息。 轻而易举就崩溃,怎么当爬虫?
但是我已经把出错的ReadToEnd这条代码放到Try...Catch里面去了啊
winner2050 2013-04-06
  • 打赏
  • 举报
回复
if (res.ToString() == null) return ans; 这个代码严重错误。
winner2050 2013-04-06
  • 打赏
  • 举报
回复
网络报错不属于程序逻辑异常,应该用try给屏蔽掉异常信息。 轻而易举就崩溃,怎么当爬虫?
weixinyaojinNUS 2013-04-06
  • 打赏
  • 举报
回复
引用 2 楼 nice_fish 的回复:
1.采集的时候要模拟人的行为,不要过于频繁,将参数带全,适当的休息一下 2.考虑使用代理或者更换IP
我也想过通过运行一段时间让这几个线程休息一会儿,但是如何做到啊?我看了很多关于多线程暂停和重启的资料,还是没搞懂。。。
  • 打赏
  • 举报
回复
system.thread.sleep(1*1000);
  • 打赏
  • 举报
回复
1.采集的时候要模拟人的行为,不要过于频繁,将参数带全,适当的休息一下 2.考虑使用代理或者更换IP
XiAnTianYiChuanMei 2013-04-04
  • 打赏
  • 举报
回复
是的,,,,服务器如果做了处理,当同一IP访问次数过多,就会被认为是 采集器来了,就会做出相应,,,,,www.aaspx.com 个人观点,,
描述:由C#编写的多线程异步抓取网页的网络爬虫控制台程序 功能:目前只能提取网络链接,所用的两个记录文件并不需要很大。网页文本、图片、视频和html代码暂时不能抓取,请见谅。 但需要注意,网页的数目是非常庞大的,如下代码理论上大概可以把整个互联网网页链接都抓下来。 但事实上,由于处理器功能和网络条件(主要是网速)限制,一般的家用电脑最多能胜任12个线程左右的抓取任务,抓取速度有限。可以抓取,但需要时间和耐心。 当然,这个程序把所有链接抓下来是可能的,因为链接占系统空间并不多,而且有记录文件的帮助,已抓取网页的数量可以堆积下去, 甚至可以把所有的互联网网络链接都存取下来,当然,最好是分批次。建议设置maxNum为500-1000左右,慢慢累积下去。 另外因为是控制台程序,有时候显示字符过多会系统会暂停显示,这时候只要点击控制台按下回车键就可以了。程序假死的时候,可以按回车键(Enter)试试。 /// 使用本程序,请确保已创建相应的记录文件,出于简化代码的考虑,本程序做的并不健壮,请见谅。 /// 默认的文件创建在E盘根目录“已抓取网址.txt”和“待抓取网址.txt”这两个文本文件中,使用者需要自行创建这两个文件,注意后缀名不要搞错。 这两个文件里面的链接基本都是有效链接,可以单独处理使用。 本爬虫程序的速度如下: 10线程最快大概500个链接每分钟 6-8线程最快大概400-500个链接每分钟 2-4线程最快大概200-400个链接每分钟 单线程最快大概70-100个链接每分钟 之所以用多线程异步抓取完全是出于效率考虑,本程序多线程同步并不能带来速度的提升,只要抓取的网页不要太多重复和冗余就可以,异步并不意味着错误。

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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