求网页抓取技术!!
想做一个程序,能抓取网页上的信息,像一篇文章的正文、标题、发表时间等,多余的信息不要。网页是任意的,不是指定哪个网站的新闻、博客等。大家都来说一说,指点一下,给个思路 --------------------编程问答-------------------- 最好用Dom解析html,标题一般在Title里面可以找到,这方面我做过一些简单的。正文的话稍微复杂,需要定义一个阀值,找那些文章中最长的Text节点,然后逐级往父节点找。发表时间就不好弄了。 --------------------编程问答-------------------- 任意的不行的,一定要指定的。不然正则不好写。
除非你像百度一样全部抓取, --------------------编程问答-------------------- 正则,正则,还是正则. --------------------编程问答-------------------- 用WebBrowser控件,其中有Document属性,能后去网页信息! --------------------编程问答-------------------- 不行。 --------------------编程问答-------------------- 这个只能针对一些网站来搞!毕竟每个网站的布局这些之类的都不同,需要分析,而且如果涉及验证码更是需要判断分析除非你能将这些个条件全部都罗列出来!那是很大的工程,不好实现 --------------------编程问答--------------------
public string GetRemoteHtmlCode(string Url)
{
string s = "";
try
{
MSXML2.XMLHTTP _xmlhttp = new MSXML2.XMLHTTPClass();
_xmlhttp.open("GET", Url, false, null, null);
_xmlhttp.send("");
if (_xmlhttp.readyState == 4)
{
s = System.Text.Encoding.Default.GetString((byte[])_xmlhttp.responseBody);
}
}
catch (Exception ex)
{
s = ex.Message + "指定的地址不存在或地址错误";
}
return s;
}
public string SniffwebCode(string code, string wordsBegin, string wordsEnd)
{
string NewsTitle = "";
Regex regex1 = new Regex("" + wordsBegin + @"(?<title>[\s\S]+?)" + wordsEnd + "", RegexOptions.Compiled | RegexOptions.IgnoreCase);
for (Match match1 = regex1.Match(code); match1.Success; match1 = match1.NextMatch())
{
NewsTitle = match1.Groups["title"].ToString();
}
return NewsTitle;
}
/// <summary>
/// 获得指定Html代码中所有超级连接的标题和连接地址:测试有效 反回DataTable列说明:title 文字 url 地址
/// </summary>
/// <param name="HtmlCode">需要匹配出超级连接的HTML代码</param>
/// <returns></returns>
public DataTable GetCodeHref(string HtmlCode)
{
//匹配指定HTML代码中所有的超级连接中的href 和超连接文字内容的正则 有时候需要根据实际情况做小调整如果标题中间有<B>文字</B>的话
string regex = @"\<a.*href\s*=\s*(?:""(?<url>[^""]*)""|'(?<url>[^']*)'|(?<url>[^\>^\s]+)).*\>(?<title>[^\<^\>]*)\<[^\</a\>]*/a\>";
Regex reg1 = new Regex(regex, RegexOptions.IgnoreCase);//创建正则表达式对象
MatchCollection ms1 = reg1.Matches(HtmlCode);//根据正则表达式匹配出所有匹配项返匹配集合
DataTable table = new DataTable();//创建存储标题和连接的内存表
table.Columns.Add("title");//标题文字列
table.Columns.Add("url");//连接字符串
foreach (Match m1 in ms1)//迭代集合获得每个匹配项
{
DataRow row = table.NewRow();//创建一行
row["title"] = m1.Groups["title"].Value.ToString();
if (m1.Groups["url"].ToString().IndexOf(ViewState["equalUrl"].ToString()) != -1)
{
row["url"] = m1.Groups["url"].Value.ToString();
}
else
{
row["url"] = ViewState["url"] + m1.Groups["url"].Value.ToString();
}
// row["url"] = m1.Groups["url"].Value.ToString();
table.Rows.Add(row);//添加行集合
}
return table;
} --------------------编程问答-------------------- 先分析网页的结构 然后用正则 --------------------编程问答-------------------- 智能分析的话,还是有难度的,就比如本页,Title为“求网页抓取技术 .NET技术 C#”,而文章的标题为“求网页抓取技术”,如何让程序自己分析就能提取出来“求网页抓取技术”?不过也并非不可能,之前做过的一个网页抓取分析项目,和这个有些类似,除了需要找到Title之外,还需要分析出来帖子所在的版块为“NET技术”和“C#”,当然做不到100%准确,只针对于论坛数据的话,90%以上准确率是有了。 --------------------编程问答-------------------- 正则
UP
补充:.NET技术 , C#