虚心使人进步

虚心学习,天天向上......
posts - 73, comments - 131, trackbacks - 0, articles - 2
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

最近在开发公司的OA系统(详见承承的小窝),领导要求公司旗下所有网站的51拉统计数据能自动抓取到我们自己的数据库中,心想这种抓取统计数据的程序以前肯定有人写过,到百度搜了一下没有找到抓取51la的,于是乎自己动手。

1、利用httpwatch找到网站入口及参数:(详情略,请百度httpwatch的使用方法)

2、利用httpwebRequest将51拉查看密码Post到网站入口,登陆成功后再进入你想要进入的页面抓取页面 

        /// <summary>
        
/// 某日或者叫时间段,51la里组员ID里——搜索引擎内——的数据。
        
/// </summary>
        
/// <param name="strStaticId"></param>
        
/// <param name="LookPass"></param>
        
/// <param name="strBeginDate"></param>
        
/// <param name="strEndDate"></param>
        
/// <returns></returns>
        public string FiveLaSeo(string strStaticId, string LookPass,string strBeginDate,string strEndDate)
        {
            CookieContainer Cc 
= new CookieContainer();

            ASCIIEncoding encoding 
= new ASCIIEncoding();
            
string postData = "id=" + strStaticId;
            postData 
+= ("&lookpass=" + LookPass);
            postData 
+= "&t=chalogin";

            
//将提交的字符串数据转换成字节数组
            byte[] data = encoding.GetBytes(postData);

            
// 设置提交的相关参数   
            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("http://www.51.la/report/0_help.asp");
            myRequest.Method 
= "POST";
            myRequest.ContentType 
= "application/x-www-form-urlencoded";
            myRequest.ContentLength 
= data.Length;
            
//cookie的容器一定要加
            myRequest.CookieContainer = Cc;

            
// 提交请求数据  
            Stream newStream = myRequest.GetRequestStream();            
            newStream.Write(data, 
0, data.Length);
            newStream.Close();

            
// 接收返回的页面  
            HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
            StreamReader reader 
= new StreamReader(myResponse.GetResponseStream(), Encoding.Default);
            
string content = reader.ReadToEnd();

            
//进去后打开特定页面的参数设置
            myRequest = (HttpWebRequest)WebRequest.Create("http://www.51.la/report/3_SE.asp?id=" + strStaticId + "&d1=" + strBeginDate + "&d2=" + strEndDate);
            myRequest.Method 
= "GET";
            myRequest.KeepAlive 
= false;
            myRequest.CookieContainer 
= Cc;

            
//接收返回的特定页面
            myResponse = (HttpWebResponse)myRequest.GetResponse();
            newStream 
= myResponse.GetResponseStream();
            reader 
= new StreamReader(myResponse.GetResponseStream(),Encoding.Default);
            content 
= reader.ReadToEnd();
            
return content;
        }

 

3、将抓取的页面进行正则表达式匹配,取出自己所需要的数据(这里我需要搜索引擎流量) 

        /// <summary>
        
/// 返回51拉中:搜索引擎的访问量IP-*?表示匹配最少的重复项目
        
/// </summary>
        
/// <param name="strStaticId"></param>
        
/// <param name="LookPass"></param>
        
/// <param name="strBeginDate"></param>
        
/// <param name="strEndDate"></param>
        
/// <returns></returns>
        public string FivelaSeoPv(string strStaticId, string LookPass,string strBeginDate,string strEndDate)
        {
            Tool.FiveLa fl 
= new FiveLa();
            
string html=fl.FiveLaSeo(strStaticId, LookPass, strBeginDate, strEndDate);
            
string pattern = @"来自搜索引擎的访问量 \( [\s\S]*? IP \) 占总访问量";
            
//string pattern = @"占总访问量";
            string number = Regex.Match(html, pattern, RegexOptions.IgnoreCase).Value;
            number 
= number.Replace("来自搜索引擎的访问量 (""").Replace(" IP )""").Replace("占总访问量","").Trim(); ;
            
if (number == "")
            { number 
= "0"; }
            
return number;
        }

 

4、最后来看看利用ActiveReport显示取得数据的效果。 

 

标签: HttpRequest

Feedback

#1楼  回复 引用   

2009-06-29 11:24 by 过路[未注册用户]
code打不开!

#2楼[楼主]  回复 引用 查看   

2009-06-29 11:32 by Showker      
@过路
不是我的问题,我把代码折叠的勾去掉就可以了。是不是不让代码折叠了现在?

#3楼  回复 引用   

2009-06-29 11:34 by lygwujian[未注册用户]
前人没做过的事情,让你轻松的解决了,佩服

#4楼  回复 引用   

2009-06-29 11:38 by yeml[未注册用户]
--引用--------------------------------------------------
lygwujian: 前人没做过的事情,让你轻松的解决了,佩服
--------------------------------------------------------


不知道你是讲真话还是反话

这种玩意对于我这种做外部提交的人来说,太小儿科了

#5楼[楼主]  回复 引用 查看   

2009-06-29 11:39 by Showker      
@lygwujian
过奖了,这种抓取数据的原理都是一样的,只是以前没人写过抓取51la的。我也是在众多前辈的基础上稍稍动了一下。

#6楼[楼主]  回复 引用 查看   

2009-06-29 11:43 by Showker      
@yeml
我是新手,在各位前辈前献丑了,还请多多指点。

#7楼  回复 引用 查看   

2009-06-29 13:13 by Flymouse      
你应该重新考虑一下你的正则表达式和Regex的使用,完全可以直接用正则表达式抓取到那个数字,不需要先找到那个字符串,再去做替换。

#8楼[楼主]  回复 引用 查看   

2009-06-29 13:20 by Showker      
@Flymouse
能给个代码吗?我也想呢

#9楼[楼主]  回复 引用 查看   

2009-06-29 13:23 by Showker      
--引用--------------------------------------------------
Flymouse: 你应该重新考虑一下你的正则表达式和Regex的使用,完全可以直接用正则表达式抓取到那个数字,不需要先找到那个字符串,再去做替换。
--------------------------------------------------------
能给个代码吗?我也想呢

#10楼[楼主]  回复 引用 查看   

2009-06-29 13:36 by Showker      
非常感谢flymouse的解答
比如这样一句话:"来自搜索引擎的访问量2345IP占总访问量"
抓取数字的正则表达式:“来自搜索引擎的访问量(\d+?)IP占总访问量”
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
Match m = r.Match(text);
string n=m.Groups[1].Value;

#11楼  回复 引用 查看   

2009-06-29 13:37 by hhe      
很好,很强
LZ 能否发给我个DEMO ,helei.top@gmail.com

#12楼[楼主]  回复 引用 查看   

2009-06-29 13:45 by Showker      
@hhe
--引用--------------------------------------------------
hhe: 很好,很强
LZ 能否发给我个DEMO ,helei.top@gmail.com
--------------------------------------------------------
不好意思,没有demo,核心都在这里了。在前台直接调用FivelaSeoPv()方法就行了。

#13楼  回复 引用 查看   

2009-06-29 15:28 by J.Motto      
收藏下,这个能用到.

#14楼  回复 引用   

2009-06-29 19:12 by huhu:)[未注册用户]
好强大的功能哦

#15楼  回复 引用 查看   

2009-06-30 11:01 by Selfocus      
收 藏 了

#16楼  回复 引用   

2009-06-30 17:01 by barque[未注册用户]
httpwebrequest请求与正则,常用的东西

#17楼  回复 引用   

2009-11-27 19:55 by 游戏秘籍[未注册用户]
很高招,www.gamedel.cn

#18楼  回复 引用 查看   

2011-06-18 15:25 by yinwenle      
有验证码也能抓取吗?