客户信息采集(慧聪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, "手&nbsp;&nbsp;&nbsp;&nbsp;机:(?<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, "电&nbsp;&nbsp;&nbsp;&nbsp;话:(?<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("&nbsp;", "");
Match Add
= getvalue(Body, "地&nbsp;&nbsp;&nbsp;&nbsp;址:(?<Add>.*?)</li>");//(?<Add>.*?)
string dizhi =Add.Groups["Add"].Value.Trim();
}

这样就能够完整的匹配出各项联系方式了。然后可以保存数据库,之后就是导入TXT等操作了。

因为需要即时显示采集进度,所以采用多线程来采集。

 

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

posted @ 2011-07-27 23:00  CHild.  阅读(3001)  评论(28)    收藏  举报