简单C#信息采集工具实现
最近想整只爬虫玩玩,顺便熟悉下正则表达式。
开发环境 vs2008 sql2000
实现方法如下
1.先抓取网页代码
2.通过正则匹配出你需要的内容
比如http://www.soso.com/q?w=%C4%E3%BA%C3&pg=1 页面中 搜索结果的标题跟连接地址。具体可以根据你的需要填写合适的地址跟正则。
3.把匹配出的内容保存到数据库中。对其中的数据可以根据需要自己进行处理
具体实现代码
1.读取网页的代码
public static string GetDataFromUrl(string url)
{
string str = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
//设置Http头;
request.AllowAutoRedirect = true;
request.AllowWriteStreamBuffering = true;
request.Referer = "";
request.Timeout = 10 * 1000;
//request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
HttpWebResponse response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
//根据http应答头来判别编码
string Characterset = response.CharacterSet;
Encoding encode;
if (Characterset != "")
{
if (Characterset == "ISO-8859-1")
{
Characterset = "gb2312";
}
encode = Encoding.GetEncoding(Characterset);
}
else
{
encode = Encoding.Default;
}
//声明一个内存流来贮存http应答流
Stream Receivestream = response.GetResponseStream();
MemoryStream mstream = new MemoryStream();
byte[] bf = new byte[255];
int count = Receivestream.Read(bf, 0, 255);
while (count > 0)
{
mstream.Write(bf, 0, count);
count = Receivestream.Read(bf, 0, 255);
}
Receivestream.Close();
mstream.Seek(0, SeekOrigin.Begin);
//从内存流里读取字符串这里涉及到了编码方案
StreamReader reader = new StreamReader(mstream, encode);
char[] buf = new char[1024];
count = reader.Read(buf, 0, 1024);
while (count > 0)
{
str += new string(buf, 0, 1024);
count = reader.Read(buf, 0, 1024);
}
reader.Close();
mstream.Close();
}
}
catch (Exception ex)
{
GetDataFromUrl(url);
}
finally
{
if (response != null)
response.Close();
}
return str;
}
2.正则匹配的代码
public static ArrayList GetString(string reg, string content)
{
Regex r = new Regex(reg, RegexOptions.Compiled);
MatchCollection matches = r.Matches(content);
ArrayList a = new ArrayList();
foreach (Match m in matches)
{
string[] arr = new string[10];
arr[0] = m.Groups[1].Value;
arr[1] = m.Groups[2].Value;
arr[2] = m.Groups[3].Value;
arr[3] = m.Groups[4].Value;
arr[4] = m.Groups[5].Value;
arr[5] = m.Groups[6].Value;
arr[6] = m.Groups[7].Value;
arr[7] = m.Groups[8].Value;
arr[8] = m.Groups[9].Value;
arr[9] = m.Groups[10].Value;
a.Add(arr);
}
return a;
}
3.如果抓取的页面很多 ,可以把多线程跟队列应用过来,提高抓取效率
Queue<int> numbers = new Queue<int>();
const int MaxCount = 5;//同时运行的最多线程数
private static object _lock = new object();
private void Test()
{
while (true)
{
int i = 0;
lock (_lock)
{
if (numbers.Count == 0)
{
flag = false;
return;
}
i = numbers.Dequeue();
}
f(i);
}
}
void Ssss()
{
for (int i = 1; i <= 100; i++)//处理的页面参数 从http://www.soso.com/q?w=你好&pg=1 到http://www.soso.com/q?w=你好&pg=100
{
numbers.Enqueue(i);
}
for (int i = 0; i < MaxCount; i++)
{
Thread thread = new Thread(new ThreadStart(Test));
thread.Name = "T" + i.ToString();
thread.Start();
}
}
private void f(int num)
{
string str = ClassLibrary1.Class1.GetDataFromUrl("http://www.soso.com/q?w=%C4%E3%BA%C3&pg="+num);
string reg = "<a href=/"([^/"]+?)/" [^>]+? target=/"_blank/">([//s//S]+?)</a>";
ArrayList a = ClassLibrary1.Class1.GetString(reg, str);
for (int i = 0; i < a.Count; i++)
{
string[] arr = (string[])a[i];
Result r = new Result();
r.Value1 = arr[0];
r.Value2 = ClassLibrary1.Class1.Html2Txt(arr[1]);
ResultManager.AddResult(r);
}
}
5.常用的一些正则表达式
* 0-多个
? 0-1个
+ 1-多个
+? 尽可能少的匹配
*? 0次或多次,尽可能少
/w 等效于 [a-zA-Z_0-9]
/W 匹配非单词
/S 非空
/s 等效于 [ /f/n/r/t/v] 空格,制表 换页
. 匹配除了换行以为的任何字符
/d 数字
[^>] 除了>以为的字符
[/u4e00-/u9fa5] 汉字
6.代码只是实现了信息采集的主要功能,根据你自己的需要更换采集页面,跟合适的正则表达式后,可以根据你的需要自动进行采集,对采集到的数据,再根据你的需要自己进行处理。
7.数据库操作部分用的3层代码生成器连接地址 在 app.config中
如果你发现有什么不合理的,需要改进的地方,邮件联系328452421@qq.com(qq常年不在线,邮件联系)朱晓 。相互交流 谢谢
顺便问下 有家是新泰的没。
下载地址 http://download.csdn.net/source/3329838
分享到:
相关推荐
如是,在串口工具的基础上,本人添加了“出厂设备”按钮,实现了程序自动采集,只需要人工将设备从串口线另一端进行更换,设备的信息就会采集在列表中,采保证列表不会重复,并可以导出为Excel表文件,文档后面提供...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点...
数据采集模块:负责从各类业务环节中实时、准确地收集信息,形成企业的基础数据资源。 数据分析模块:运用统计学、人工智能等技术对数据进行深度挖掘和智能分析,提供决策支持。 业务流程管理模块:设计、执行...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...
但在很多人的眼里,客户资源管理被认为是进行客户资料采集的工具,殊不知在良好客户资源管理系统的辅助下,能让客户感受到“无微不至的关怀。” 企业客户资源管理系统实现了企业客户资源管理的信息化,它记录着一个...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例位置...
实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...
273 实例190 获取窗口文本 273 实例191 判断文件是否正在被使用 274 实例192 在程序中调用.HLP文件 275 实例193 C#中实现文件拖放 276 实例194 文件比较 276 第7章 操作系统与Windows...
实例229 C#中实现文件拖放 317 实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例...
实例118 使用数据采集器实现库存盘点 434 实例119 员工考勤指纹识别 436 第12章 游戏开发 实例120 贪吃蛇 444 实例121 华容道 451 实例122 俄罗斯方块 458 实例123 五子棋 466 技术要点对应实例...
数据采集模块:负责从各类业务环节中实时、准确地收集信息,形成企业的基础数据资源。 数据分析模块:运用统计学、人工智能等技术对数据进行深度挖掘和智能分析,提供决策支持。 业务流程管理模块:设计、执行、...