使用c#程序抓取大众点评网上的商家信息并用dataGridView显示出来

解决方案 »

  1.   

    使用HttpWebRequest抓取网页信息,然后用正则匹配找到商家
      

  2.   


    这个是我的程序  //根据Url地址得到网页的html源码 
            private string GetWebContent(string Url)
            {
                string strResult = "";
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                    //声明一个HttpWebRequest请求 
                    request.Timeout = 30000;
                    //设置连接超时时间 
                    request.Headers.Set("Pragma", "no-cache");
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream streamReceive = response.GetResponseStream();
                    Encoding encoding = Encoding.GetEncoding("utf-8");
                    StreamReader streamReader = new StreamReader(streamReceive, encoding);
                    strResult = streamReader.ReadToEnd();
                    //关闭读取流对象
                    streamReader.Close();
                }
                catch
                {
                    MessageBox.Show("出错");
                }
                return strResult;
            }
            //点击按钮显示信息
            private void btnShow_Click(object sender, EventArgs e)
            {
                //要抓取的URL地址 
                string Url = "http://www.dianping.com/search/category/2/10/g311";            //得到指定Url的源码 
                string strWebContent = GetWebContent(Url);            rchCode.Text = strWebContent;
    }从这里可以获取网页源码,关键是正则获取商家信息,正则表达式我用不好,也就是根据http://www.dianping.com/search/category/2/10/g311这个网址怎样获取"印巷小馆(燕莎桥店)  朝阳区朝阳公园路好运街1-8号  58670286"
      

  3.   

    其实也不一定要用正则,分析一下结构,自己用字符串IndexOf()等方法提取出来就可以        static void Main(string[] args)
            {
                string str = "<dd><ul class=\"re\"></ul><strong class=\"average\"><span class=\"Price\">¥</span>63</strong><ul class=\"detail\"><li class=\"shopname\"><a href=\"/shop/4719387?KID=74659\" class=\"BL\" title=\"印巷小馆\" kid=\"74659\" onclick=\"pageTracker._trackPageview('dp_search_shopname_beijing');$APClickTracker(74659,40);\" target=\"_blank\">印巷小馆(燕莎桥店)</a><span class=\"tip\"><a href=\"/search/branch/2/0_3596584/g0\" onclick=\"pageTracker._trackPageview('dp_search_branch_beijing')\" target=\"_blank\"><em>分店</em></a></span><span class=\"tip\"><a href=\"/bussiness\" class=\"spread\" target=\"_blank\" onclick=\"pageTracker._trackPageview('dp_search_snippet_biz')\">推广</a></span><li class=\"address\"><strong>地址:</strong><a href=\"/search/category/2/0/r14\" class=\"Black-H\">朝阳区</a>朝阳公园路好运街1-8号&nbsp;&nbsp;58670286</li></li><li class=\"tags\"></li></ul><p class=\"fn\"></p></dd>";            string namefront = ");\" target=\"_blank\">";
                int begin = str.IndexOf(namefront) + namefront.Length;
                int end = str.IndexOf("</a><span class=\"tip\">");
                Console.WriteLine(str.Substring(begin, end - begin));
                Console.ReadKey();
            }
    输出—— 印巷小馆(燕莎桥店)
      

  4.   

    LZ 你抓取网页源码 获取的信息肯定有固定的规律
    用indexof+substring 是可以实现的 
    当然对于网页源码来说 用正则是最好的
    我前几天才做了一个抓取网页源码 获取客户信息的软件
      

  5.   

    如果按您的做法
    我这样做的
    string str = "<dd><ul class=\"re\"></ul><strong class=\"average\"><span class=\"Price\">¥</span>63</strong><ul class=\"detail\"><li class=\"shopname\"><a href=\"/shop/4719387?KID=74659\" class=\"BL\" title=\"印巷小馆\" kid=\"74659\" onclick=\"pageTracker._trackPageview('dp_search_shopname_beijing');$APClickTracker(74659,40);\" target=\"_blank\">印巷小馆(燕莎桥店)</a><span class=\"tip\"><a href=\"/search/branch/2/0_3596584/g0\" onclick=\"pageTracker._trackPageview('dp_search_branch_beijing')\" target=\"_blank\"><em>分店</em></a></span><span class=\"tip\"><a href=\"/bussiness\" class=\"spread\" target=\"_blank\" onclick=\"pageTracker._trackPageview('dp_search_snippet_biz')\">推广</a></span><li class=\"address\"><strong>地址:</strong><a href=\"/search/category/2/0/r14\" class=\"Black-H\">朝阳区</a>朝阳公园路好运街1-8号&nbsp;&nbsp;58670286</li></li><li class=\"tags\"></li></ul><p class=\"fn\"></p></dd>";            string str3 = ");\" target=\"_blank\">";
                int begin3 = str.IndexOf(str3) + str3.Length;
                int end3 = str.IndexOf("</a><span class=\"tip\">");
                MessageBox.Show(str.Substring(begin3, end3 - begin3));
                
                string namefront = "\" class=\"Black-H\">";
                int begin = str.IndexOf(namefront) + namefront.Length;
                int end = str.IndexOf("</a>朝阳公园路好运街1-8号&nbsp;&nbsp;58670286</li></li><li class=\"tags\"></li></ul><p class=\"fn\"></p></dd>");
               // MessageBox.Show("",str.Substring(begin, end - begin));
                string str1 = "\" class=\"Black-H\">朝阳区</a>";
                int begin1 =str.IndexOf(str1)+str1.Length;
                int end1 = str.IndexOf("&nbsp;&nbsp;");
                MessageBox.Show(str.Substring(begin, end - begin)+str.Substring(begin1,end1-begin1));            string str2 = "</a>朝阳公园路好运街1-8号&nbsp;&nbsp;";
                int begin2 = str.IndexOf(str2)+str2.Length;
                int end2 = str.IndexOf("</li></li><li class=\"tags\"></li></ul><p class=\"fn\"></p></dd>");
                MessageBox.Show(str.Substring(begin2,end2-begin2));
    这样只能获取一条商家的信息,关键是要获取所有的商家信息,很急,请帮助
      

  6.   

    简单方法使用webBrowser直接解析,缺点是效率低下。
    稍微复杂方法是直接发http请求,用正则表达式匹配。
      

  7.   

    正则相对复杂些,另外如果对方一修改,你又得重新弄。
    还是用我的代码吧!   Function GetKey(ByVal HTML, ByVal Start, ByVal Last)
            Dim body1 = Split(HTML, Start)
            Dim body2 = Split(body1(1), Last)
            GetKey = body2(0)
        End Function    text = GetKey(test, A_Text_Star.Text, A_Text_End.Text)通过两个指定字符得到中间的值
      

  8.   

    上次帮你偷了google map 坐标,这次又换别的了啊,看来LZ要一抓到底了   
      

  9.   

    写个循环,每取完一条就把前面的源码Remove掉,然后继续,
    另外要用共有信息提取 不要用诸如 "\" class=\"Black-H\">朝阳区</a>" 来提取,
    因为事先并不知道这标签里面是“朝阳区”或其他。
    写起来比较麻烦一些,应该没什么难度。