采集是会做了,可是只能输入一个地址,然后采集那个地址
第一个问题:怎么只要输入一个地址,然后采集这个网页,还采集这一页网页的上一页下一页的链接,
如果这页采集完了就自动到下一页的链接采集呢?
第二个问题:怎么采用多线程采集呢?查了下资料说多线程可以很好的利用cpu,而且速度肯定比一篇一篇采集快
采集代码
string url = "http://www.qq.com/";
string path = Server.MapPath("index.html");
StringBuilder sb = new StringBuilder();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
WebResponse rep = req.GetResponse();
using (StreamReader sr = new StreamReader(rep.GetResponseStream())
{
sb.Append(sr.ReadToEnd());
}
using (StreamWriter sw = new StreamWriter(path,false))
{
sw.WriteLine(sb.ToString());
}
}
请教下该怎么改呢?还有我是写在button事件里的 这样可以吗?
35 个解决方案
#1
这个例子,你可以先看看http://topic.csdn.net/u/20100814/01/B3CF6C1D-E006-4282-8C04-37C38BF326E6.html
#2
#3
开个公司好累
#4
使用系统线程池来执行一个任务,就是这样一句话:
ThreadPool.QueueUserWorkItem(new Action(()=>{
//todo: 这里写你要执行的方法的代码
}));
#5
用HttpRequest实现,不要用HttpWebRequest
#6
采集网页的上一页下一页,应该知道URL的规律写个循环就可以了吧
#7
#8
#9
用采用线程池
#10
sp大哥自己做老板拉!
DateTime star = DateTime.Now;
StringBuilder sb = new StringBuilder();
Thread td = null;
foreach (string result in ilist)
{
td = new Thread(new ParameterizedThreadStart(Save2));
/*
为什么这里用多线程来采集的话总是没有采集完,只有7,8个
如果改用Save(result, Server.MapPath(@"collection/" + datetime + ".html"));这样直接保存的话是有全部采集到,总共241个,这是为什么呢?
*/
td.Start(result);
}
DateTime end = DateTime.Now;
Response.Write((end - star).TotalMilliseconds);
#11
自动重定向。
#12
为什么不要用HttpWebrequest呢?有什么坏处吗?
#13
最好能在网上找个例子。先读读吧....csdn下载里面应该很多。
#14
class Program
{
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
actions.Add(() => Console.WriteLine("A1"));
actions.Add(() => Console.WriteLine("A2"));
actions.Add(() => Console.WriteLine("A3"));
actions.Add(() => Console.WriteLine("A4"));
foreach (var action in actions)
{
ThreadPool.QueueUserWorkItem(state => action(), null); }
Console.Read();
}
}
#15
#16
多线程不会的路过...
#17
#18
按照ls的大侠们试了一下线程池的,可是只采集到18个,总共有241个的,用单线程的话就可以全部采集到,
这是为什么呢?而且屏幕右下角端口号会自己掉下来
这是为什么呢?而且屏幕右下角端口号会自己掉下来
protected void Button5_Click(object sender, EventArgs e)
{
DateTime star = DateTime.Now;
StringBuilder sb = new StringBuilder();
foreach (string result in ilist)//ilist是链接的集合
{
ThreadPool.QueueUserWorkItem(delegate(object param)
{
Save2(result);
});
}
DateTime end = DateTime.Now;
Response.Write((end - star).TotalMilliseconds);
}
#19
我是来帮顶的。。。。
#20
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
#21
#22
SOS紧急求救!
#23
多线程不咋的会 帮你顶
#24
没有这方面的经验 帮顶
#25
#26
路过............................
#27
谢谢大家!继续等待!
#28
一页一页的抓取,主要是变化url里面的参数。
比如:
http://www.baidu.com/s?wd=asd&pn=0&usm=2 第1页
http://www.baidu.com/s?wd=asd&pn=10&usm=2 第2页
生成对应的url即可,然后扔给采集代码里面的url
线程,声明下,然后调用对应方法就可以
Thread thread = new Thread(new ThreadStart(方法));
thread.Start();
多线程多声明几次就可以。
#29
大侠在来帮帮忙!
#30
多线程,网上很多例子
#31
可以 参考 火车头 软件
简单点 网页源码分析呢
简单点 网页源码分析呢
#32
#33
#34
路过............................
#35
学习,顺便帮顶!人家说了,帮顶有分地.....
#1
这个例子,你可以先看看http://topic.csdn.net/u/20100814/01/B3CF6C1D-E006-4282-8C04-37C38BF326E6.html
#2
#3
开个公司好累
#4
使用系统线程池来执行一个任务,就是这样一句话:
ThreadPool.QueueUserWorkItem(new Action(()=>{
//todo: 这里写你要执行的方法的代码
}));
#5
用HttpRequest实现,不要用HttpWebRequest
#6
采集网页的上一页下一页,应该知道URL的规律写个循环就可以了吧
#7
#8
#9
用采用线程池
#10
sp大哥自己做老板拉!
DateTime star = DateTime.Now;
StringBuilder sb = new StringBuilder();
Thread td = null;
foreach (string result in ilist)
{
td = new Thread(new ParameterizedThreadStart(Save2));
/*
为什么这里用多线程来采集的话总是没有采集完,只有7,8个
如果改用Save(result, Server.MapPath(@"collection/" + datetime + ".html"));这样直接保存的话是有全部采集到,总共241个,这是为什么呢?
*/
td.Start(result);
}
DateTime end = DateTime.Now;
Response.Write((end - star).TotalMilliseconds);
#11
自动重定向。
#12
为什么不要用HttpWebrequest呢?有什么坏处吗?
#13
最好能在网上找个例子。先读读吧....csdn下载里面应该很多。
#14
class Program
{
static void Main(string[] args)
{
List<Action> actions = new List<Action>();
actions.Add(() => Console.WriteLine("A1"));
actions.Add(() => Console.WriteLine("A2"));
actions.Add(() => Console.WriteLine("A3"));
actions.Add(() => Console.WriteLine("A4"));
foreach (var action in actions)
{
ThreadPool.QueueUserWorkItem(state => action(), null); }
Console.Read();
}
}
#15
#16
多线程不会的路过...
#17
#18
按照ls的大侠们试了一下线程池的,可是只采集到18个,总共有241个的,用单线程的话就可以全部采集到,
这是为什么呢?而且屏幕右下角端口号会自己掉下来
这是为什么呢?而且屏幕右下角端口号会自己掉下来
protected void Button5_Click(object sender, EventArgs e)
{
DateTime star = DateTime.Now;
StringBuilder sb = new StringBuilder();
foreach (string result in ilist)//ilist是链接的集合
{
ThreadPool.QueueUserWorkItem(delegate(object param)
{
Save2(result);
});
}
DateTime end = DateTime.Now;
Response.Write((end - star).TotalMilliseconds);
}
#19
我是来帮顶的。。。。
#20
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
#21
#22
SOS紧急求救!
#23
多线程不咋的会 帮你顶
#24
没有这方面的经验 帮顶
#25
#26
路过............................
#27
谢谢大家!继续等待!
#28
一页一页的抓取,主要是变化url里面的参数。
比如:
http://www.baidu.com/s?wd=asd&pn=0&usm=2 第1页
http://www.baidu.com/s?wd=asd&pn=10&usm=2 第2页
生成对应的url即可,然后扔给采集代码里面的url
线程,声明下,然后调用对应方法就可以
Thread thread = new Thread(new ThreadStart(方法));
thread.Start();
多线程多声明几次就可以。
#29
大侠在来帮帮忙!
#30
多线程,网上很多例子
#31
可以 参考 火车头 软件
简单点 网页源码分析呢
简单点 网页源码分析呢
#32
#33
#34
路过............................
#35
学习,顺便帮顶!人家说了,帮顶有分地.....