苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 10697|回复: 10

[其他] 求助 才学C# 在做一个 网页抓取器

[复制链接]
发表于 2013-12-18 10:31:13 | 显示全部楼层 |阅读模式
如题  就是做一个 网页抓取器 当网站更新的时候  能把更新的内容保存下来  求一详细点的思路,最好有关键的内容,能给出源代码甚好@苏飞


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-12-18 10:38:01 | 显示全部楼层
抓取的要具体问题具体分析,你要抓什么样的网站,然后再说明一下怎么样才算是更新。

如果只是单纯的看一下页面是否更新,直接使用我的Htttphelper类就行,把网页的Html保存下来,定时 去请求,发现与保存的不同就是更新了。或者你有你自己的标志也行。这个关键看你自己怎么给定义更新这个概念
发表于 2013-12-18 10:38:32 | 显示全部楼层
另外我的用户名是站长苏飞,你@的时候要写全了,这样没有提醒
 楼主| 发表于 2013-12-18 10:39:59 | 显示全部楼层
站长苏飞 发表于 2013-12-18 10:38
另外我的用户名是站长苏飞,你@的时候要写全了,这样没有提醒

{:soso_e127:}失误失误 ,下次不会了
 楼主| 发表于 2013-12-18 10:50:35 | 显示全部楼层
站长苏飞 发表于 2013-12-18 10:38
抓取的要具体问题具体分析,你要抓什么样的网站,然后再说明一下怎么样才算是更新。

如果只是单纯的看一 ...

我要抓的是  一个网站发布了新的新闻 ,我就给它的标题和内容都保存下来 ,  
我是这样想的  获取文字的标题div  保存到本地   再用定时器隔几秒获取一次内容   与本地匹配  不同的就保存  
发表于 2013-12-18 10:56:46 | 显示全部楼层
可以,你的思路没有问题,不过新增了,你还得分析链接,我估计应该是有一个链接列表,或者这个新闻网页有规律,可以自己生成连接来抓取和更新。比如 http://www.sufeinet.com/thread-2-1-1.html 这样的,你只需要修改中间的一个2就行了,自增长的,不需要去网站抓网址,只要自己动态生成就行,没有的就说明是没有,如果有了就继续增长。直到无数据

这个其实关键靠你自己来完成,因为我们并不知道什么是你想要的数据,从技术角度来说,就是正则怎么写,网页怎么获取的问题,这些你可以在开发的时候再上来讨论。
 楼主| 发表于 2013-12-18 11:00:19 | 显示全部楼层
站长苏飞 发表于 2013-12-18 10:56
可以,你的思路没有问题,不过新增了,你还得分析链接,我估计应该是有一个链接列表,或者这个新闻网页有规 ...

好的
 楼主| 发表于 2013-12-18 15:36:33 | 显示全部楼层
@站长苏飞  怎么运用正则把不同的保存进去  相同的不要   还有文章的内容怎么显示不出来了 我给注释掉了
[C#] 纯文本查看 复制代码
namespace CollectionNews
{
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Threading;
    using HtmlAgilityPack;
    using NewLife.Log;
    using NewLife.Web;

    public class Collection
    {
        #region Fields

        /// <summary>
        /// 采集网站(安徽农网)
        /// </summary>
        public static string outFileName = "";                  //生成的文件名
        private string websiteUrl = "http://www.ahnw.gov.cn";

        private Timer timer = null;
        /// <summary>
        /// 下载客户端
        /// </summary>
        private WebClientX webClient = new WebClientX(true, true);

        #endregion

        public void StartCollection()
        {
            this.timer = new Timer(this.CollectNews, null, 1000, 8 * 1000);
        }


        #region Public Method

        public void CollectNews(object obj)
        {
            this.webClient.Credentials = CredentialCache.DefaultCredentials;

            byte[] data = this.webClient.DownloadData(this.websiteUrl); // 下载网页
            string msg = Encoding.Default.GetString(data); // 网页byte 转换成文字形式

            HtmlDocument documnet = new HtmlDocument();
            documnet.LoadHtml(msg); // 组装成网页格式
            HtmlNode root = documnet.DocumentNode; // 根节点
            string path = @"//div[@id=""NewsListPanel""]/ul/li"; // 匹配div
            HtmlNodeCollection liList = root.SelectNodes(path); // 获取所有li节点

            StringBuilder sb = new StringBuilder();
            

            if (liList != null)
            {
                foreach (var li in liList)
                {

                    //XTrace.WriteLine("----------------------新闻标题-----------------------------");
                    XTrace.WriteLine("新闻标题:{0}", li.InnerText.Replace("\r", string.Empty).Replace("\n", string.Empty).Trim());
                    sb.AppendLine(li.InnerText.Replace("\r", string.Empty).Replace("\n", string.Empty).Trim());
                    //XTrace.WriteLine("----------------------新闻标题-----------------------------");
                    //XTrace.WriteLine("----------------------新闻详细-----------------------------");
                    //XTrace.WriteLine("新闻详细:");
                    //HtmlNode anode = li.FirstChild;
                    //string href = this.websiteUrl + anode.Attributes["href"].Value;
                    //byte[] data2 = this.webClient.DownloadData(href);
                    //string detailMsg = Encoding.Default.GetString(data2);
                    //HtmlDocument detailHtml = new HtmlDocument();
                    //detailHtml.LoadHtml(detailMsg);
                    //HtmlNode detailRoot = detailHtml.DocumentNode;
                    //string detailPath = @"//div [@id=""content_show""]";
                    //HtmlNodeCollection detailli = detailRoot.SelectNodes(detailPath);
                    //foreach (HtmlNode node in liList)
                    //{
                    //    XTrace.WriteLine(node.InnerText);
                    //}
                    //XTrace.WriteLine("----------------------新闻详细-----------------------------");



                    

                                       
                }

                outFileName = "C:\\class\\" + "1111" + ".txt";

                using (StreamWriter sw = new StreamWriter(outFileName,true))//将获取的内容写入文本
                {

                    sw.WriteLine(sb.ToString());

                }

            }
        }
    }
   

        #endregion
}
更多图片 小图 大图
组图打开中,请稍候......
 楼主| 发表于 2013-12-18 15:39:35 | 显示全部楼层
@站长苏飞  我要的效果是  一个标题对应一个文章内容   有新的文章出来  标题跟内容都更新  没有则不用
发表于 2013-12-18 15:44:53 | 显示全部楼层
流星91 发表于 2013-12-18 15:39
@站长苏飞  我要的效果是  一个标题对应一个文章内容   有新的文章出来  标题跟内容都更新  没有则不用

我建议你不管有没有更新都更新,文件名称或者记录名称就以网址中的变量做为ID,这样直接覆盖就行,如果没有变化覆盖了也是原来的,如果变化了更好,反正你都是要取一下子的
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2025-4-20 09:05

© 2014-2021

快速回复 返回顶部 返回列表