`

用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://www.shaoqun.com/");
//ArrayList al = inc.GetMatchesStr(Html, "<a[^>]*?>.*?</a>");
ArrayList al = inc.GetMatchesStr(Html, @"href\s*=\s*(?:[\'\""\s](?<1>[^\""\']*)[\'\""])");//提取链接

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;

//下载图片
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);
}
}
}

分享到:
评论

相关推荐

    C#网页数据采集工具

    C#作为一种强大的编程语言,因其丰富的类库和高效性,被广泛用于构建网页数据采集工具。本篇将深入探讨如何利用C#进行网页数据采集,以及相关的重要知识点。 首先,C#中的WebClient或HttpClient类是进行网页数据...

    C#采集网页数据小工具

    在IT行业中,数据采集是一项重要的任务,特别是在大数据分析、搜索引擎优化和市场研究等领域。...通过掌握这些知识,开发者可以构建出一个功能完备且易于使用的网页数据采集工具,满足各种数据抓取需求。

    C# 数据采集系统 智能采集 数据分析 整套源码

    总的来说,"C# 数据采集系统 智能采集 数据分析 整套源码"是一个综合性的项目,涵盖了从网络数据采集、智能策略、数据处理、数据库操作到系统架构等多个方面的知识。通过深入理解并实践这套源码,开发者可以提升在...

    C#网页数据采集源码1.zip

    【标题】"C#网页数据采集源码1.zip"是一个包含C#编程语言实现的网页数据采集工具的源代码集合。这个压缩包很可能是为了帮助开发者理解和学习如何使用C#来抓取和处理网络上的数据。 【描述】描述中的"C#网页数据采集...

    C# 双色球网页数据采集

    在项目中,文件名称为“双色球网页数据采集”,这可能是一个包含源代码、配置文件和可能的测试数据的综合文件。源代码可能包括几个关键部分:用于控制`webBrowser`导航的类,使用正则表达式解析HTML的函数,以及负责...

    c#数据采集类 .net采集类

    这个C#类库提供了一套基础的数据采集工具,包括生成随机命名的字符串以确保唯一性,解析文件扩展名以识别文件类型,以及获取远程资源的HTML代码。这些功能对于开发爬虫程序、内容管理系统或任何需要处理网络数据的...

    C#数据采集例子

    在这个"C#数据采集例子"中,我们将探讨如何利用C#进行数据采集,同时也会关注正则表达式在其中的应用,尽管描述中提到对正则表达式的掌握程度不高,但它是数据处理中的关键工具。 1. **C#数据采集基础** - **...

    采集数据程序_采集数据_C#数据采集_数据采集c++_

    数据采集是IT领域中至关重要的一个环节,它涉及到从各种来源获取信息并将其转化为可分析的数据。在这个过程中,编程语言的选择对于实现高效、精准的数据采集至关重要。标题中的"采集数据程序_采集数据_C#数据采集_...

    c# vs2008数据采集(正则采集)

    在实际项目中,为了提高效率和可维护性,你可能还需要设计和实现一个数据采集框架。这个框架可以包括错误处理机制、数据清洗和存储逻辑,以及可能的多线程或异步处理,以便同时处理多个数据源。在VS2008中,你可以...

    C#实现网页信息采集

    本项目以"C#实现网页信息采集"为主题,旨在教授如何使用C#编程语言来构建一个简单但实用的网页数据抓取工具。C#是微软开发的一种面向对象的编程语言,具有丰富的类库和强大的功能,非常适合进行网络编程。 首先,...

    asp.net(c#)做一个网页数据采集工具

    通过这个软件一两天就完成了几千产品数据的录入,可见很多工作不是一味用人工去做,作为一个程序员,就是要让很多让那些经常做重复性的、繁琐的工作中的人解放出来。下面只是写了一些核心代码,而且采集必须要和对应...

    NETSpider-c#网站数据采集

    在IT领域,数据采集是数据分析、研究和业务决策的重要组成部分,而.NETSpider正是这样一个工具,它利用了C#的强大功能和灵活性来处理网页抓取任务。 C#(读作"C sharp")是一种面向对象的编程语言,由微软公司开发...

    C#操作Selenium自动化测试,采集数据实例源码。

    Selenium是一个广泛使用的自动化测试工具,它支持多种编程语言,包括C#。本实例将深入讲解如何利用C#操作Selenium进行自动化测试,以及如何利用它进行数据采集。 首先,让我们了解一下Selenium的基本概念。Selenium...

    多线程数据采集器源码(C# 2.0).rar

    标题中的“多线程数据采集器源码(C# 2.0)”是指一个使用C#编程语言2.0版本实现的程序,其主要功能是通过多线程技术进行数据采集。在软件开发中,多线程是一种常见的优化策略,能够充分利用多核处理器的计算能力,...

    数据采集 打包资源5个 c# .net sharp

    在网页数据采集时,开发者经常用正则表达式匹配和提取特定格式的文本,如URL、电子邮件地址、日期等。 6. **Form数据**:在Web应用中,表单数据通常是用户输入的数据,通过POST或GET方法提交到服务器。在数据采集时...

    文章自动采集系统,C#程序,CSHARP软件

    综上所述,这个C#实现的文章自动采集系统提供了灵活的配置选项和易用性,是数据采集任务的有力工具。通过学习和理解其工作原理,开发者不仅可以提升自身在C#编程和网络爬虫领域的技能,还能为日常的数据处理工作带来...

    asp.net网页数据采集源码

    总的来说,这个ASP.NET网页数据采集源码提供了一个基础的框架,可以帮助开发者学习如何在.NET环境中实现网络爬虫,进行数据抓取和初步分析。通过学习和修改这个源码,你可以定制自己的数据采集任务,满足特定的数据...

Global site tag (gtag.js) - Google Analytics