客户信息采集(慧聪360)
客户信息采集器,主要是获取HTML然后分析。大虾请漂过,不要打击我这个菜鸟。
先上几个辅助方法。
///<summary>
/// 获取html文件,需引用MSXML2
///</summary>
///<param name="url">URL地址</param>
///<returns></returns>
publicstring GetBody(string url)
{
string s ="";
MSXML2.XMLHTTP26 _xmlhttp =new MSXML2.XMLHTTP26();
_xmlhttp.open("GET", url, false, null, null);
_xmlhttp.send("");
if (_xmlhttp.readyState ==4)
{
s = Encoding.Default.GetString((byte[])_xmlhttp.responseBody);
}
return s;
}
///<summary>
/// 正则匹配
///</summary>
///<param name="str">需要匹配的字符</param>
///<param name="matchStr">正则表达式</param>
///<returns></returns>
private Match getvalue(string str, string matchStr)
{
Regex rg =new Regex(matchStr, RegexOptions.Multiline | RegexOptions.Singleline);
return rg.Match(str);
}
其实原理很简单,根据URL获取到HTML源码之后,通过正则表达式匹配,获取需要的客户信息其中包括公司名称、联系人、联系地址、手机、联系电话(当然前提是客户有留下这些方式)。废话不多说,下面来介绍下匹配方法。
我要采集的是关键字为:杭州;地址为:杭州。所以地址为:http://s.hc360.com/company/%B9%AB%CB%BE.html?L=7&e=49&m=2&v=4&z=%D6%D0%B9%FA%3A%D5%E3%BD%AD%CA%A1%3A%BA%BC%D6%DD%CA%D0
然后寻找分页规则,不难发现URL中有的e的参数每次翻页都在变,所以规则为:(i * 24 + 1),所以新URL为:http://s.hc360.com/company/%B9%AB%CB%BE.html?L=7&e=" + (i * 24 + 1) + "&m=2&v=4&z=%D6%D0%B9%FA%3A%D5%E3%BD%AD%CA%A1%3A%BA%BC%D6%DD%CA%D0
//采集HTML为源代码,页码为1000页
for (int i =1; i <1000+1; i++)
{
string Url ="http://s.hc360.com/company/%B9%AB%CB%BE.html?L=7&e="+ (i *24+1) +"&m=2&v=4&z=%D6%D0%B9%FA%3A%D5%E3%BD%AD%CA%A1%3A%BA%BC%D6%DD%CA%D0";
string Body = GetBody(Url);
}
接下来就是获取列表页中公司联系方式页面的URL地址,这需要通过正则表达式来匹配。
string str =string.Empty;
Match ID = getvalue(Body, "<div>\n<a href=\"(?<ID>.*?)\" onclick=\"return hcclick");
if (ID.Groups.Count >1)
{
for (; ID.Success; ID = ID.NextMatch())
{
str += ID.Groups["ID"].Value.Trim() +"shop/company.html*";
}
}
str = str.Substring(0, str.Length -1);
string[] loginID = str.Split('*');//这里存储公司联系方式页面的URL地址
这其中的规则最重要的是这个正则表达式:"<div>\n<a href=\"(?<ID>.*?)\" onclick=\"return hcclick" (?<ID>.*?)这个取出来的就是URL了。
接下来又是获取公司联系方式页面的HTML源代码。
//循环获取每个公司的详细情况
foreach (var Urls in loginID)
{
if (Urls !="")
{
Body = GetBody(Urls);
}
}
获取到取公司联系方式页面的HTML源代码之后又是通过正则表达式来匹配了。
Match Photos = getvalue(Body, "手 机:(?<Photos>.*?)</li>");//(?<Photos>.*?)
//如果该公司没有记录手机号码,不予采集
if (Photos.Groups["Photos"].Value.Trim() !="")
{
Match Names = getvalue(Body, "infoname=(?<Names>.*?)&infoid=");//(?<Names>.*?)
string mingcheng = Names.Groups["Names"].Value.Trim();
Match Tel= getvalue(Body, "电 话:(?<Tel>.*?) </li>");//(?<Tel>.*?)
string dianhua = Photo.Groups["Tel"].Value.Trim();
string shouji = Photos.Groups["Photos"].Value.Trim(); //(?<Photos>.*?)
Match Likes = getvalue(Body, "<span class=\"bluezzbold font14\" style=\"\" title=\"(?<Likes>.*?)\">");//(?<Likes>.*?)
string lianxiren = Likes.Groups["Likes"].Value.Trim().Replace(" ", "");
Match Add = getvalue(Body, "地 址:(?<Add>.*?)</li>");//(?<Add>.*?)
string dizhi =Add.Groups["Add"].Value.Trim();
}
这样就能够完整的匹配出各项联系方式了。然后可以保存数据库,之后就是导入TXT等操作了。
因为需要即时显示采集进度,所以采用多线程来采集。

最后还做了个展示的小程序,贴个界面吧!

作者:InNet
出处:http://www.cnblogs.com/jiangbiao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
浙公网安备 33010602011771号