惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
Jina AI
Jina AI
博客园_首页
Y
Y Combinator Blog
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
MongoDB | Blog
MongoDB | Blog
雷峰网
雷峰网
罗磊的独立博客
博客园 - Franky
Last Week in AI
Last Week in AI
Vercel News
Vercel News
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
月光博客
月光博客
WordPress大学
WordPress大学
W
WeLiveSecurity
Apple Machine Learning Research
Apple Machine Learning Research
TaoSecurity Blog
TaoSecurity Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 聂微东
Schneier on Security
Schneier on Security
Engineering at Meta
Engineering at Meta
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 【当耐特】
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
P
Proofpoint News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 叶小钗
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
L
LINUX DO - 最新话题
S
Security @ Cisco Blogs
B
Blog RSS Feed
B
Blog
爱范儿
爱范儿
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tailwind CSS Blog
Attack and Defense Labs
Attack and Defense Labs
V
Visual Studio Blog
NISL@THU
NISL@THU
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
A
Arctic Wolf

博客园 - 早班火车

很还念这里。。。说些什么呢。。。 程序,好亲切~ IE与DOM下访问内联样式和外部样式表的常用方法总结 关于javascript中的事件学习及总结 总结了几个常用的sql server系统表的使用 在做一个小网站的一些心得与遇到的问题总结,为以后方便查阅。 用sql脚本一条条导数据的两种方法,需返回唯一标识@@IDENTITY作为插入到第二个表用。 也来为自己的博客加个花,兼AJAX跨域的一点疑问。 关于IE缓存和AJAX的一点思考和疑问 退一步海阔天空:抛开思维定势 DOCTYPE:你可能不知道的 我的2007--从2008做起,加油! javascript常用验证 正则表达式参考手册__Mini版 树的操作(绑定数据库,添加新节点,删除节点)(转载加实现) 一段好用的ajax和div漂浮显示效果实现 ajax小贴士 好用的缓存类 javascript操纵剪贴板
一步一步教你抓数据——用.net精确提取网站数据的通用方法
早班火车 · 2008-01-26 · via 博客园 - 早班火车

具体实现思路: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 下一步过滤掉不必要的特殊字符,把下载下来的网页内容清干净,方便抓取(比如空格双引号)

过滤特殊字符

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的键值插入数据库。