一步一步教你抓数据——用.net精确提取网站数据的通用方法 [转]
2008年02月23日 星期六 16:53

具体实现思路:

1 首先用WebClient类下载网页源码
public static string DownLoadHtml(string url)
        {
            string output = "";
            Encoding encode = Encoding.Default;
            WebClient webclient = new WebClient();
            try
            {
                webclient.Headers.Add("Referer", url);
                byte[] buff = webclient.DownloadData(url);
                output = encode.GetString(buff);
            }
            catch
            {
            }
            return output;
        }
需要注意的:
有的网页可能下不下来,有种种原因比如需要cookie,编码问题等等
这是就要具体问题具体分析比如在头部加入cookie
webclient.Headers.Add("Cookie", cookie);
这样可能需要一些重载方法。根据需要写就可以了。

2 下一步过滤掉不必要的特殊字符,把下载下来的网页内容清干净,方便抓取(比如空格双引号)
过滤特殊字符
public static string RepalceStr(string str)
        {
          
            str = str.Replace("\r\n", "");
            str = str.Replace("\"", "");
            str = str.Replace(":", "");
            str = str.Replace("\t", "");
            str = str.Replace(" ", "");
            str = str.Replace("'", "");
            str = str.Replace("\r", "");
            str = str.Replace("\n", "");
            return str;
        }
3最后也是最重要的即从目标字符串的第begin个字符处开始,读取以 strBegin 开头,
strEnd 结束的字符串.并返回获取到的内容,如果不存在,返回空。
public static string GetHTMLContent(string strTarget, string strBegin, string

strEnd, ref int begin)
        {
            string result;
            int posBegin, posEnd;
            posBegin = strTarget.IndexOf(strBegin, begin);
            if (posBegin != -1)
            {
                posEnd = strTarget.IndexOf(strEnd, posBegin + strBegin.Length);
                if (posEnd > posBegin)
                {
                    result = strTarget.Substring(posBegin, posEnd + strEnd.Length - posBegin);
                    begin = posEnd + strEnd.Length;
                    return result;

}
            }
            begin = -1;
            return "";
        }
需要注意的:
begin是引用类型,有可能一段网页中可能会有重复的关键词
比如<!--文章标题-->,<!--文章标题-->,如果你想对第二个文章标题里的内容
操作那么begin就派上用场了,他每次抓取完都返回抓取内容的结尾,在调用
此方法就可以得到第二个<!--文章标题-->的内容。

在抓取完的数据一般都存在数据库中,如果是一个表直接存放就可以了.
如果是两个表比如新闻名称和新闻内容分开,这是你就需要用到sql server的一个全局变量
Select @@IDENTITY;它可以标识生成记录的唯一ID。以用作插入新闻内容用。(两个表以

news_id关联)

4 因为是精确抓取在程序处理的过程中要用到很多正则,比如去除连接去除括号等,这当然是

简单的正则了。
(见到有高手说动态生成正则还没弄懂学习之~)
Regex pattern1 = new Regex("<a.*?</a>", RegexOptions.Singleline |

RegexOptions.IgnoreCase);
Regex pattern2 = new Regex("(.*?)", RegexOptions.Singleline |

RegexOptions.IgnoreCase);
newscontent = pattern1.Replace(newscontent, "");
newscontent = pattern2.Replace(newscontent, "");
程序里除了主要的方法外用得最多的就属正则表达式了,处理字符串用正则表达式那是当仁不

让,。

5 下面是抓取时一些特殊情况的处理:
1比如新闻只让抓当日的
static DateTime todaysdate = DateTime.Now.Date;
//date为抓取的日期
DateTime newsday = Convert.ToDateTime(date);
newsday = newsday.Date;
TimeSpan s = todaysdate - newsday;
if (s.TotalDays.ToString() == "0")
     {
    这里干活
     }
2过滤特殊字符比如url里有bbs关键字的不抓
if (newsurl.IndexOf("bbs") > 0)
{
      continue;
}
3写入新闻唯一id到文件避免同一天抓两次数据引起新闻重复(再抓的时候比较就可以了)
FileStream fs = new FileStream(filepaths, FileMode.OpenOrCreate,

FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("gb2312"));
sw.Flush();
sw.BaseStream.Seek(0, SeekOrigin.Begin);
//唯一id
sw.Write(newsqid);
sw.Close();

6抓数据的时候可以把要抓的网站和一些关键字写入xml一边程序里直接调用
这样比较省时省力,比如:
<?xml version="1.0" encoding="utf-8" ?>
<GetDatas>
<MyData>
<CarUrl>http://www.webhost/mysite.html</CarUrl>
    <CarFilterf><![CDATA[列表页特征字符串开始]]></Filterf>
    <CarFilters><![CDATA[列表页特征字符串结束]]></Filters>
    <CarDetailFilterf><![CDATA[详情页特征字符串开始]]></CarDetailFilterf>
    <CarDetailFilters><![CDATA[详情页特征字符串结束]]></CarDetailFilters>
    <NewsKey>种类一</NewsKey>
</MyData>
<MyData>
    <CarUrl>http://www.webhost/mysite.html</CarUrl>
    <Filterf><![CDATA[列表页特征字符串开始]]></CarFilterf>
    <Filters><![CDATA[ 列表页特征字符串结束 ]]></CarFilters>
    <DetailFilterf><![CDATA[详情页特征字符串开始]]></CarDetailFilterf>
    <DetailFilters><![CDATA[详情页特征字符串结束]]></CarDetailFilters>
    <NewsKey>种类二</NewsKey>
</CarData>
<MyData>
程序里根据newskey的种类写入数据库方便调用。
7最后就是写入数据库了,可以以上面xml里newskey的键值插入数据库。

转载于:https://www.cnblogs.com/odz521/archive/2008/08/14/1267916.html

一步一步教你抓数据——用.net精确提取网站数据的通用方法 [转]相关推荐

  1. python抓取招聘数据_Python爬取招聘网站数据并做数据可视化处理

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于青灯编程 ,作者:清风 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有 ...

  2. 腾讯云服务器文件怎么恢复吗,实战腾讯云镜像备份恢复云服务器实例提取网站数据文件...

    本来这个问题是准备今天操作的,但是担心今天要陪伴孩子出去玩,所以就在昨天晚上给客户搞定.这个网友的问题是服务器到期,然后找腾讯云客服备份镜像,但是他服务器已经到期删除,但是镜像好在还在的,所以我准备帮 ...

  3. php接收vb post数据,VB Post方式提取网页数据

    Public Function getDataAsHtml(ByVal url As String, ByVal postData As String, ByVal modifyCook As Boo ...

  4. 全网最详细SoilGrid数据的下载与提取(含四种方法)

    方法一:R语言 (可直接提取并导出数据,快慢依电脑性能和网速而定...) soil_world在R中的使用指南(可以直接调用SG的数据) 代码如下 ///感谢zihao师兄鼎力相助 install.p ...

  5. oracle数据块调用存储过程,VC调用存储过程的通用方法(ORACLE篇)

    先对上一篇调用SQLServer的存储过程作一点补充,就是如果存储过程里有Insert,update,delete等操作,最后返回结果集,按示例代码有可能得不到数据,因为返回的数据有可能不在第一个结果 ...

  6. 抓取国外网站数据合法吗?法律分析

    在互联网时代,数据是一种非常珍贵的资源,而获取数据的方式也越来越多样化.抓取(爬虫)国外网站数据是一种获取数据的常见方式.然而,抓取国外网站数据是否合法呢?这是一个备受争议的话题.本文将从法律.道德. ...

  7. powerbi中python网站数据_Power BI应用实战:批量爬取网页数据

    前面介绍PowerBI数据获取的时候,曾举了一个从网页中获取数据的例子,但当时只是爬取了其中一页数据,这篇文章来介绍如何用PowerBI批量采集多个网页的数据. 本文以智联招聘网站为例,采集工作地点在 ...

  8. Pycharm + python 爬虫简单爬取网站数据

    本文主要介绍简单的写一个爬取网站图片并将图片下载的python爬虫示例. 首先,python爬虫爬取数据,需要先了解工具包requests以及BeautifulSoup requests中文文档:ht ...

  9. Mac电脑Safari 浏览器中Cookie 和网站数据如何管理

    Safari 浏览器是Mac电脑上自带的一款非常好用的浏览器,如何管理Safari 浏览器中Cookie 和网站数据呢?跟随小编一起来看看吧! 可以更改 Safari 浏览器偏好设置中的选项,从而让 ...

最新文章

  1. Linux C编程--线程操作2--线程同步详解
  2. VC6.0 预编译(转)
  3. 高考计算机会考基础知识点,2017高考一定会考的46个知识点!
  4. [转载]VC++程序员应当如何阅读ADO文档
  5. LeetCode 1361. 验证二叉树(图的出入度)
  6. Python 爬虫实战2 百度贴吧帖子
  7. 三个已存在15年的 Linux 内核漏洞
  8. 程序状态字寄存器PSW
  9. c++输入回车结束循环,C++ cin如何输入回车停止
  10. Dev-cpp5.4.0的详细安装步骤
  11. 摩西十诫 摩西简介 世界宗教图谱
  12. 浅谈安科瑞餐饮油烟在线监测系统在餐饮油烟治理中起到的作用
  13. 小学-综合素质【5】
  14. 趣味编程入门 Scratch 开发跳一跳小游戏-邵立志-专题视频课程
  15. word文档左下方竟然出现无法删除的小横线???
  16. CF1132D Stressful Training (binary search)(greedy)
  17. H5+css+js前端特效源代码:发光动画按钮:上传按钮
  18. Python计算机二级大题
  19. [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件
  20. ZOJ 3898 Stean (求旋转体体积与面积)

热门文章

  1. ArrayList和Vector的异同
  2. 通过java api操作hdfs(kerberos认证)
  3. xgboost之spark上运行-scala接口
  4. 【Spring 5】响应式Web框架前瞻
  5. compose配置文件参数详解
  6. [雪峰磁针石博客]大数据Hadoop工具python教程9-Luigi工作流...
  7. 排序(选择,冒泡,直接插入,希尔排序)
  8. Discuz x2.5目录结构注释
  9. 如何修正导入模型的旋转? How do I fix the rotation of an imported model?
  10. shell的数组操作