采集方法

原创 2011年01月23日 22:55:00

详细出处参考:http://www.jb51.net/article/21468.htm

最近做一个网站,该网站需要添加4000多 产品信息,如果用人工方法去别的网站copy那至少要花费半月时间才能完成,所以我个办法使用c#作出来了一个网页数据采集软件

//提取产品列表页中产品最终页的网页
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Trim() == "" || textBox2.Text.Trim() == "")
{
MessageBox.Show("网址和域名不能为空!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
try
{
string Html = inc.GetHtml("http://study.pctoday.net.cn");
//ArrayList al = inc.GetMatchesStr(Html, "<a[^>]*?>.*?</a>");
ArrayList al = inc.GetMatchesStr(Html, @"href/s*=/s*(?:[/'/""/s](?<1>[^/""/']*)[/'/""])");//提取链接

" title="Replica Watches:">Replica Watches Buy Full Quality Popular Luxury Watches at Amazing Price, Your One Stop Discount Swiss Watches StoreExclusive Replica Rolex Watches, Tag Heuer Watches Replica, Cartier Watches online Sale!
StringBuilder sb = new StringBuilder();
foreach (object var in al)
{
string a = var.ToString().Replace("/"", "").Replace("'", "");
a = Regex.Replace(a, "href=", "", RegexOptions.IgnoreCase | RegexOptions.Multiline);
if (a.StartsWith("/"))
a = textBox2.Text.Trim() + a;
if (!a.StartsWith("http://"))
a = "http://" + a;
sb.Append(a + "/r/n");
}
textBox5.Text = sb.ToString();//把提取到网址输出到一个textBox,每个链接占一行

MessageBox.Show("共提取" + al.Count.ToString() + "个链接", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception err)
{
MessageBox.Show("提取出错!原因:" + err.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}


//把采集的产品页面html代码进行字符串处理,提取需要的代码,最后保存到本地一个access数据库中,同时提取产品图片地址并自动现在图片到本地images文件夹下
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//填充产品表
Database.ExecuteNonQuery("delete from Tb_Product");
DataTable dt2 = new DataTable();
OleDbConnection conn = new OleDbConnection(Database.ConnectionStrings);
OleDbDataAdapter da = new OleDbDataAdapter("select * from Tb_Product", conn);
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);
da.Fill(dt2);
dt2.Rows.Clear();
BackgroundWorker worker = (BackgroundWorker)sender;//这个是做一个进度条
string[] Urls = textBox5.Text.Trim().ToLower().Replace("/r/n", ",").Split(',');
DataTable dt = new DataTable();
StringBuilder ErrorStr = new StringBuilder();
string html = "", ImageDir = AppDomain.CurrentDomain.BaseDirectory + "Images//";
//循环每次采集网址
for (int i = 0; i < Urls.Length; i++)
{
try
{
if (!worker.CancellationPending)
{
if (Urls[i] == "")
return;
html = inc.GetHtml(Urls[i]);//获取该url的html代码
DataRow NewRow = dt2.NewRow();
//产品名
string ProductName = html.Substring(html.IndexOf("<title>") + 7);
NewRow["ProductName"] = ProductName.Remove(ProductName.IndexOf("</title>")).Trim();
//产品编号
NewRow["ModelId"] = NewRow["ProductName"].ToString().Substring(NewRow["ProductName"].ToString().IndexOf("Model:") + 6).Trim();
//产品介绍,这些都是根据不同网站的html做相应的修改
string Introduce = html.Substring(html.IndexOf("Product Details") + 26);
Introduce = Introduce.Remove(Introduce.IndexOf("</table>") + 8).Trim()
NewRow["Introduce"] = Introduce;

" title="Replica Watches:">Replica Watches Buy Full Quality Popular Luxury Watches at Amazing Price, Your One Stop Discount Swiss Watches StoreExclusive Replica Rolex Watches, Tag Heuer Watches Replica, Cartier Watches online Sale!
//下载图片
string ProductImage = html.Substring(html.IndexOf("align=center><img") + 17);
ProductImage = textBox2.Text.Trim() + ProductImage.Substring(ProductImage.IndexOf("src=/"") + 5);
ProductImage = ProductImage.Remove(ProductImage.IndexOf("/""));
try
{
inc.DownFile(ProductImage, ImageDir + ProductImage.Substring(ProductImage.LastIndexOf("/") + 1));
}
catch (Exception)
{
ErrorStr.Append("下载图片失败,图片地址:" + ImageDir + ProductImage.Substring(ProductImage.LastIndexOf("/") + 1) + "/r/n");
}

dt2.Rows.Add(NewRow);
//Thread.Sleep(100);
worker.ReportProgress((i + 1) * 100 / Urls.Length, i);
toolStripStatusLabel1.Text = "处理进度:" + (i + 1).ToString() + "/" + Urls.Length.ToString();//进度条
}
}
catch (Exception err)
{
ErrorStr.Append("采集错误:" + err.Message + ";网址:" + Urls[i] + "/r/n");
}
}
da.Update(dt2);
DataBind(dt2);
ShowError(ErrorStr.ToString());
}
/// <summary>
/// ASPX页面生成静态Html页面,作者:郑少群
/// </summary>
public static string GetHtml(string url)
{
StreamReader sr = null;
string str = null;
//读取远程路径
WebRequest request = WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
sr = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(response.CharacterSet));
str = sr.ReadToEnd();
sr.Close();
return str;
}

// 提取HTML代码中的网址
public static ArrayList GetMatchesStr(string htmlCode, string strRegex)
{
ArrayList al = new ArrayList();
Regex r = new Regex(strRegex, RegexOptions.IgnoreCase | RegexOptions.Multiline);
MatchCollection m = r.Matches(htmlCode);
for (int i = 0; i < m.Count; i++)
{
bool rep = false;
string strNew = m[i].ToString();
// 过滤重复的URL
foreach (string str in al)
{
if (strNew == str)
{
rep = true;
break;
}
}
if (!rep) al.Add(strNew);
}
al.Sort();
return al;
}
public static void DownFile(string Url, string Path)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
long size = response.ContentLength;
//创建文件流对象
using (FileStream fs = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] b = new byte[1025];
int n = 0;
while ((n = stream.Read(b, 0, 1024)) > 0)
{
fs.Write(b, 0, n);
}
}
}

 

正文开始:

        假如我们采集网址:http://info.laser.hc360.com/list/z_news_yw.shtml 上的新闻,要求采集标题、时间、内容、单篇文章如果有翻页则采集完全。

      这种类型的采集就是从指定网页获得新闻列表(即url),然后通过其url获得新闻详情,这是一种很常见的采集方式,有可能到很多页面上去采集,所以我们可以采用接口来构造基类。

     首先定义  IGatherInfo.cs

Code

         接口定义了三个成员:gatherTime采集时间,GatherUrlList()从指定网址抽取新闻Url,GatherNewsDetail()读取新闻详细内容。

      下面我们分析一下该程序中可能要用的公共方法,定义在 GatherInfoBase.cs

            1.时间转换函数string DateToString()

Code

            2.获取远程文件源代码 string GetRemoteHtmlCode(string url)

Code

            3.从HtmlCode截取字符串 string SniffwebCode(string code, string wordsBegin, string wordsEnd),用于抽取标题,时间,正文

Code

            4.替换HTML源代码 string RemoveHTML(string HtmlCode),用于将抽取到的正文内容去Html

Code

            5.更改文件名方法string changFileName(string filename, string addStr),利用其分页规律定义其增加的字符,

 

Code

     因为程序比较小,所以我采用access来存取数据,创建GatherInfo_laser_hc360.db,添加两个表

      GatherUrlsstrUrl  备注,strGahterTime 文本

     GatherInfosstrUrl  备注,upTime 文本,title 文本,content 备注

用数据集实现数据连接,代码中可见。

最后我们来实现对所给网址的采集,直接给出代码

Code
Code

             6.获取页面连接

Code


接下来我们定义一个NewsDeatil.cs

一种移动GIS离线数据采集的方法

1、 目的及意义     离线情况下的数据采集非常重要,可以突破网络限制、降低数据流量、扩张采集范围和提高工作效率。 2、 技术架构 2.1 技术概念        离线数据分为两类:矢量底图...
  • esricd
  • esricd
  • 2013年05月31日 22:16
  • 5669

MySQL数据库运行状态数据采集的脚本

【导读】 前一篇文章MySQL数据库运行状态数据的采集方法介绍我们一种用于数据库运行状态数据采集的方法,以及数据采集的重要性,还针对需要采集的数据项功能做了详细的解释。本篇文章,将讲述数据库运行状态...
  • jackYangyang
  • jackYangyang
  • 2014年04月02日 16:38
  • 869

最基本的网页爬虫(数据采集)

经常看到一些交流网页爬虫的初学者来问有没有教程,什么是爬虫呢?(ps:不是爬虫类,记得最搞笑的是一个交流这个主题的群,有人进来发广告,广告的内容则是卖蜥蜴、变色龙之类的爬虫)。ok,言归正传,什么是网...
  • hu948162999
  • hu948162999
  • 2016年02月01日 16:55
  • 1343

另类新浪微博基本数据采集方法(值得深思)

0x00 前言 有同学评论说之前绕过新浪访客系统的方法不能用了,我测试了一下,确实不能用了。原因很简单,新浪现在强制登录,没有cookie就是不行,即便是搜索引擎的爬虫也不行。 现在用谷歌搜索出来...
  • zyh_1988
  • zyh_1988
  • 2016年05月12日 14:31
  • 1010

常见数控机床的数据采集方法比较

现在国内外市场上出现了一些对数控机床进行数据采集和监控的系统。现对这些系统的采集方法进行比较 一.对高档机床数控系统的数据采集     目前常见的数据采集厂家都采用数控系统厂商提供的数据采集软件...
  • liwb1987
  • liwb1987
  • 2017年11月29日 09:55
  • 237

一种日志采集装置及方法

摘要 本发明提供了一种日志采集装置及方法,其中,日志采集装置包括:日志监控模块,用于监控当前服务器上的多个应用系统的日志文件;确定各日志文件新增的记录,并保存各日志文件以及新增的记录;数据传输服...
  • baidu_24932821
  • baidu_24932821
  • 2016年04月09日 13:52
  • 1887

数据采集及预处理

一、数据采集方法 1.数据来源 一手数据:数据的直接来源。 二手数据:数据的间接来源。内部来源:比如财务报表,包括会计计算,成本资料等。外部来源:比如各类统计年鉴等,调查机构发布的数据等。...
  • back_to_dream
  • back_to_dream
  • 2016年05月20日 13:30
  • 3625

webrtc windows api音频采集总结

AudioDeviceWindowsWave类中创建了一个线程,线程调用函数为ThreadFunc,并在其中调用ThreadProcess函数,线程的调用通过_timeEvent事件进行控制,而_ti...
  • masterzdj
  • masterzdj
  • 2015年10月12日 22:49
  • 997

一种日志采集装置和日志采集方法

摘要 本发明涉及一种日志采集装置和方法。其中装置包括至少一个用于日志收集的客户端和至少一个用于日志记录的服务器;所述客户端和服务器之间通过网络进行实时的日志信息发送。方法包括:客户端生成日志信息...
  • baidu_24932821
  • baidu_24932821
  • 2016年01月09日 10:42
  • 2044

php采集程序的方法

php采集程序的方法在我们程序开发的过程中是经常要遇到的,那我们常用的采集方法有哪些呢,下面我们一起来看具体的方法,还附带有具体实例,让大家一看就明白,会用。 方法一:file_get_cont...
  • liuzp111
  • liuzp111
  • 2014年06月09日 16:47
  • 798
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:采集方法
举报原因:
原因补充:

(最多只允许输入30个字)