网页内容抓取

tossgoon 2014-12-29 11:12:20
想实现一个功能:
对一个特定网站上的内容进行信息抓取,提取出感兴趣的信息,保存到本地,如何实现?
没什么头绪,本人只对html、javascript、C#这些东西知道一些,网上搜了一些,关于如何用C#实现的版本不太多,有没有做过的指点下思路?或给个例子就更好了。谢谢大家。
...全文
177 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tossgoon 2015-01-07
  • 打赏
  • 举报
回复
最后用了sp大神的方法实现了,同时谢谢pengbo2016提供的思路,非常感谢大家。webbrowser有一个不太方便的地方就是多线程的实现时,只能用STA模式,但是对access数据库的操作在STA模式下有些问题。还是感谢。
by_封爱 版主 2014-12-29
  • 打赏
  • 举报
回复
1句话就搞定了啊..

var 源文件=new webclient().downloadstring("http://www.baidu.com");
tossgoon 2014-12-29
  • 打赏
  • 举报
回复
如何得到这个网页上的所有信息呢
shawn_yang 2014-12-29
  • 打赏
  • 举报
回复
正则捕获
老张一笑 2014-12-29
  • 打赏
  • 举报
回复
好吧,我多余了,楼上就是用webbrowser
老张一笑 2014-12-29
  • 打赏
  • 举报
回复
个人认为用webbrowser控件比较方便,省去很多复杂的正则.
风一叶 2014-12-29
  • 打赏
  • 举报
回复
最近项目有做过相关的方案,大致分3步 1.获取网页所有内容(包含异步加载内容) 2.正则或者xml匹配对应的内容 3.入库导出 第一步: 其一.获得正常加载内容:

   public static string GetGeneralContent(string url, int index, Encoding encoding = null)
        {
            string strResult = "";
            try
            {
                Console.WriteLine(string.Format("{0}:开始加载第{1}个页面,页面地址:{2}.", DateTime.Now, index, url));
                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();
                StreamReader streamReader = new StreamReader(streamReceive, encoding==null?Encoding.Default:encoding);
                strResult = streamReader.ReadToEnd();
                Console.WriteLine(string.Format("{0}:内容加载完毕.", DateTime.Now));
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.WriteLine(string.Format("{0}:开始写入HTML文件", DateTime.Now));
            using (StreamWriter sw = new StreamWriter(string.Format(Environment.CurrentDirectory + "//{0}.html", index)))
            {
                sw.WriteLine(strResult);
            }
            Console.WriteLine(string.Format("{0}:html 文件 已经生成!", DateTime.Now));
            Console.WriteLine(string.Format("{0}:数据开始入库", DateTime.Now));
            return strResult;
        }
其二 若有些网站的内容是异步加载的上面方法将不适用了,请使用下面方法(有些网站需要cookie验证的也包含)

     static bool isComplete = false;
        static System.Timers.Timer timer = new System.Timers.Timer();
        #region CoreMethod
        public static string Load(string url, int index, Action<string> setCookie = null)
        {
            var stopwatch=new Stopwatch();
            stopwatch.Start();
            Console.WriteLine(string.Format("{0}:开始加载第{1}个页面,页面地址:{2}.", DateTime.Now, index, url));
            var browser = new WebBrowser();
            if (setCookie != null)
            {
                setCookie.Invoke(url);
            }
            browser.ScriptErrorsSuppressed = true;
            browser.Navigate(url);
            //先要等待加载完毕
            Console.WriteLine(string.Format("{0}:开始加载动态内容.", DateTime.Now));
            while (browser.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
                if (stopwatch.Elapsed.Minutes > 3)
                {
                    stopwatch.Reset();
                    throw new Exception("请求站点超时!");
                }
            }
            timer.Elapsed += new System.Timers.ElapsedEventHandler(Target);
            timer.Interval = 1000 * 5;
            timer.Start();
            //继续等待 5s,等待js加载完
            while (!isComplete)
            {
                Application.DoEvents();
            }
            HTMLDocument htmldocument = (HTMLDocument)browser.Document.DomDocument;
            string gethtml = htmldocument.documentElement.outerHTML;
            Console.WriteLine(string.Format("{0}:动态内容加载完毕.", DateTime.Now));
            //写入文件
            using (StreamWriter sw = new StreamWriter(string.Format(Environment.CurrentDirectory + "//{0}.html", index)))
            {
                sw.WriteLine(gethtml);
            }

            return gethtml;
        }
        private static void Target(object sender, ElapsedEventArgs elapsedEventArgs)
        {
            isComplete = true;
            timer.Stop();
        }
       
其三.获取网页异步请求内容不局限于第二种方法,目前使用casperjs效率更为高效,方法就不提供了,找度娘哈很多demo 第二就是用正则匹配了,建议使用notepad++打开方便查找匹配, 最后导出就不说了
__lhy 2014-12-29
  • 打赏
  • 举报
回复
先把页面download下来 然后正则 正则后取到如有必要 在split 获得最终数据
tossgoon 2014-12-29
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
以前写过一个简单的demo,你可以参考一下http://bbs.csdn.net/topics/390420459
你好,我测试了一下你写的方法 var doc = new HtmlDocument(); 这句代码出错啊,好像htmlDocument不能直接实例化吧?如何解决? 还有 doc.Load(new StringReader(content));确实也没有这个方法啊。
  • 打赏
  • 举报
回复
这个例子中包括了: 从网页链接关联到其它网页,并行下载,识别网页整体的语法树结构(或者你需要的任何局部结构),读取搜索到的 html 标签的属性。等等。
  • 打赏
  • 举报
回复
以前写过一个简单的demo,你可以参考一下http://bbs.csdn.net/topics/390420459

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧