第一步:首先需要将csv先装换成datatable,这样我们就容易进行对datatable进行遍历:

  /// 将CSV文件的数据读取到DataTable中
/// CSV文件路径
/// 返回读取了CSV数据的DataTable
public DataTable OpenCSV(string fileName)
{
DataTable dt = new DataTable();
FileStream fs = new FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine;
//标示列数
int columnCount = ;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{
aryLine = strLine.Split(',');
if (IsFirst == true)
{
IsFirst = false;
columnCount = aryLine.Length;
//创建列
for (int i = ; i < columnCount; i++)
{
DataColumn dc = new DataColumn(aryLine[i]);
dt.Columns.Add(dc);
}
}
else
{
DataRow dr = dt.NewRow();
for (int j = ; j < columnCount; j++)
{
dr[j] = aryLine[j];
}
dt.Rows.Add(dr);
}
}
sr.Close();
fs.Close();
return dt;
}

将csv文件转换成datatable

特别备注:遍历dadatable的几种方式已经将datatable装换成csv文件:

一、将DataTable内容写入到CSV文件
/// /// 将DataTable中的数据保存成CSV文件
/// private void btnSaveCSV_Click(object sender, EventArgs e)
{
saveFileDialog1.Filter = "CSV文件|*.CSV";
saveFileDialog1.InitialDirectory = "C:\\";
if (saveFileDialog1.ShowDialog() == DialogResult.Cancel)
{
return;
}
else
{
string fileName = saveFileDialog1.FileName;
SaveCSV(ds.Tables[], fileName);
}
} /// /// 将DataTable中数据写入到CSV文件中
/// /// 提供保存数据的DataTable
/// CSV的文件路径
public void SaveCSV(DataTable dt, string fileName)
{
FileStream fs = new FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
string data = "";
//写出列名称
for (int i = ; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
if (i < dt.Columns.Count - )
{
data += ",";
}
}
sw.WriteLine(data);
//写出各行数据
for (int i = ; i < dt.Rows.Count; i++)
{
data = "";
for (int j = ; j < dt.Columns.Count; j++)
{
data += dt.Rows[i][j].ToString();
if (j < dt.Columns.Count - )
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
MessageBox.Show("CSV文件保存成功!");
}

将datatable转换成csv

遍历datatable的方法2009-- :02方法一:
DataTable dt = dataSet.Tables[];
for(int i = ; i < dt.Rows.Count ; i++)
{
string strName = dt.Rows[i]["字段名"].ToString();
} 方法二:
foreach(DataRow myRow in myDataSet.Tables["temp"].Rows)
{
var str = myRow[].ToString();
} 方法三:
foeach(DataRow dr in dt.Rows)
{
object value = dr["ColumnsName"];
} 方法四:
DataTable dt=new DataTable();
foreach(DataRow dr in dt.Rows)
{
for(int i=;i<dt.Columns.Count;i++)
{
dr[i];
}
} 方法五
DataRow[] dataRows = null;
dataRows = dataTable.Select(fieldParentID + "='" + treeNode.Tag.ToString() + "'", dataTable.DefaultView.Sort);
foreach (DataRow dataRow in dataRows)
{ DataRow dataRow = dataTable.Rows[i]; ?? = dataRow[fieldParentID].ToString();
}

遍历datatable的几种方式

第二步呢: 就是必须用到post方式提交啦,

    /// <summary>
/// post数据请求,返回html代码
/// </summary>
/// <param name="areaName">输入百科词条</param>
/// <returns></returns>
public string UrlPost(string areaName)
{
Encoding encoding = Encoding.GetEncoding("UTF-8");
Stream outstream = null;
Stream instream = null;
StreamReader sr = null; string url = "http://baike.baidu.com/search/word?word=" + areaName; HttpWebRequest request = null; HttpWebResponse response = null; // 准备请求,设置参数 request = WebRequest.Create(url) as HttpWebRequest; request.Method = "POST"; //request.ContentType = "application/x-www-form-urlencoded";
request.ContentType = "text/xml";//注意了,上面的那种方式不可采用,因为当遇到xml格式的就会报远程服务器错误。500 byte[] data = encoding.GetBytes(url); request.ContentLength = data.Length; outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Flush(); outstream.Close(); //发送请求并获取相应回应数据 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回结果网页(html)代码 string content = sr.ReadToEnd();
return content; }

post方式请求数据返回html数据

第三部,就是遍历datatable,然后遍历出每个关键字,以post方式提交到百度百科,返回html,然后用正则表达式进行对数据的筛选

    /// <summary>
/// 点击按钮执行程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btn_click_Click(object sender, EventArgs e)
{
DataTable dts = OpenCSV("C:\\Users\\kingtopinfo\\Desktop\\CITYLOCATION.csv"); foreach (DataRow dr in dts.Rows)
{
string sql = "";
string regstr = "";
string regspit = "";
string Title, Content = "";
int Id = Convert.ToInt32(dr["ID"].ToString());
int CityId = Convert.ToInt32(dr["CITYID"].ToString());
decimal Latitude = Convert.ToDecimal(dr["LATITUDE"]);
decimal Longitude = Convert.ToDecimal(dr["LONGITUDE"]);
//提交数据给页面并返回html
string value = dr["CITYNAME"].ToString();
string html = UrlPost(value);
//对数据进行处理。
Regex reg = new Regex(@"<div class=""biItemInner"">(\s|\S)+?(<\/div>\s*?)");
MatchCollection mc = reg.Matches(html);
foreach (Match m in mc)
{
regspit += Regex.Replace(Regex.Replace(m.Value, @"</div[^>]*>", ":"), @"</span[^>]*>", ","); }
regstr = Regex.Replace(regspit, @"</?div[^>]*>|</?span[^>]*>|</?a[^>]*>|&nbsp;", "");
string[] area = Regex.Split(regstr, ":", RegexOptions.IgnoreCase);
foreach (string i in area)
{
string[] areaspit = i.Split(',');
if (areaspit.Length==)
{
Title = areaspit[];
Content = areaspit[];
SqlParameter[] paras = {
new SqlParameter("@Id", Id),
new SqlParameter("@cityId", CityId),
new SqlParameter("@latitude", Latitude),
new SqlParameter("@longitude", Longitude),
new SqlParameter("@cityName", value),
new SqlParameter("@title", Title),
new SqlParameter("@content", Content ),
}; sql = "INSERT INTO chinaarea(ID,CITYID,LATITUDE,LONGITUDE,CITYNAME,TITLE,CONTENT) VALUES (@Id,@cityId,@latitude,@longitude,@cityName,@title,@content)";
SaveSql(sql,paras); } }
}
}

遍历表格,发送请求,正则筛选,存入数据库

第四部分,就是数据库的操作了

const string connString = @"Data Source =.;Database = Area;Integrated Security=True";

  /// <summary>
/// 存入数据库
/// </summary>
/// <param name="str"></param>
public void SaveSql(string str,SqlParameter[] para)
{
SqlConnection conn = new SqlConnection(connString);
conn.Open();
string mysql = str;
SqlCommand cmd = new SqlCommand(mysql, conn);
cmd.Parameters.AddRange(para);
cmd.ExecuteNonQuery();
conn.Close();
}

数据库操作

 此外,这里对正则表达式进行解释

 因为返回的都是这种类型的数据,而我们需要得到的是里面的内容,所以采取正则匹配和替换

<div class="biItem"><div class="biItemInner"><span class="biTitle">中文名称</span><div class="biContent">北京</div></div></div>

<div class="biItem"><div class="biItemInner"><span class="biTitle">外文名称</span><div class="biContent">Beijing</div></div></div>

Regex reg = new Regex(@"<div class=""biItemInner"">(\s|\S)+?(<\/div>\s*?)");     找出<div class="biItemInner"><div>里的内容

Regex.Replace(Regex.Replace(m.Value, @"</div[^>]*>", ":"), @"</span[^>]*>", ","); 对div和span进行替换和以:分组(便于之后数据处理)

Regex.Replace(regspit, @"</?div[^>]*>|</?span[^>]*>|</?a[^>]*>|&nbsp;", ""); 将regspit里面&nbsp 还有a标签进行替换(也就是去掉里面的这些标签)

最终的代码整合:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
public partial class csv : System.Web.UI.Page
{
const string connString = @"Data Source =.;Database = Area;Integrated Security=True";
protected void Page_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 点击按钮执行程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btn_click_Click(object sender, EventArgs e)
{
DataTable dts = OpenCSV("C:\\Users\\kingtopinfo\\Desktop\\CITYLOCATION.csv"); foreach (DataRow dr in dts.Rows)
{
string sql = "";
string regstr = "";
string regspit = "";
string Title, Content = "";
int Id = Convert.ToInt32(dr["ID"].ToString());
int CityId = Convert.ToInt32(dr["CITYID"].ToString());
decimal Latitude = Convert.ToDecimal(dr["LATITUDE"]);
decimal Longitude = Convert.ToDecimal(dr["LONGITUDE"]);
//提交数据给页面并返回html
string value = dr["CITYNAME"].ToString();
string html = UrlPost(value);
//对数据进行处理。
Regex reg = new Regex(@"<div class=""biItemInner"">(\s|\S)+?(<\/div>\s*?)");
MatchCollection mc = reg.Matches(html);
foreach (Match m in mc)
{
regspit += Regex.Replace(Regex.Replace(m.Value, @"</div[^>]*>", ":"), @"</span[^>]*>", ","); }
regstr = Regex.Replace(regspit, @"</?div[^>]*>|</?span[^>]*>|</?a[^>]*>|&nbsp;", "");
string[] area = Regex.Split(regstr, ":", RegexOptions.IgnoreCase);
foreach (string i in area)
{
string[] areaspit = i.Split(',');
if (areaspit.Length==2)
{
Title = areaspit[0];
Content = areaspit[1];
SqlParameter[] paras = {
new SqlParameter("@Id", Id),
new SqlParameter("@cityId", CityId),
new SqlParameter("@latitude", Latitude),
new SqlParameter("@longitude", Longitude),
new SqlParameter("@cityName", value),
new SqlParameter("@title", Title),
new SqlParameter("@content", Content ),
}; sql = "INSERT INTO chinaarea(ID,CITYID,LATITUDE,LONGITUDE,CITYNAME,TITLE,CONTENT) VALUES (@Id,@cityId,@latitude,@longitude,@cityName,@title,@content)";
SaveSql(sql,paras); } }
}
} /// 将CSV文件的数据读取到DataTable中
/// CSV文件路径
/// 返回读取了CSV数据的DataTable
public DataTable OpenCSV(string fileName)
{
DataTable dt = new DataTable();
FileStream fs = new FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine;
//标示列数
int columnCount = 0;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{
aryLine = strLine.Split(',');
if (IsFirst == true)
{
IsFirst = false;
columnCount = aryLine.Length;
//创建列
for (int i = 0; i < columnCount; i++)
{
DataColumn dc = new DataColumn(aryLine[i]);
dt.Columns.Add(dc);
}
}
else
{
DataRow dr = dt.NewRow();
for (int j = 0; j < columnCount; j++)
{
dr[j] = aryLine[j];
}
dt.Rows.Add(dr);
}
}
sr.Close();
fs.Close();
return dt;
} /// <summary>
/// 存入数据库
/// </summary>
/// <param name="str"></param>
public void SaveSql(string str,SqlParameter[] para)
{
SqlConnection conn = new SqlConnection(connString);
conn.Open();
string mysql = str;
SqlCommand cmd = new SqlCommand(mysql, conn);
cmd.Parameters.AddRange(para);
cmd.ExecuteNonQuery();
conn.Close();
} /// <summary>
/// post数据请求,返回html代码
/// </summary>
/// <param name="areaName">输入百科词条</param>
/// <returns></returns>
public string UrlPost(string areaName)
{
Encoding encoding = Encoding.GetEncoding("UTF-8");
Stream outstream = null;
Stream instream = null;
StreamReader sr = null; string url = "http://baike.baidu.com/search/word?word=" + areaName; HttpWebRequest request = null; HttpWebResponse response = null; // 准备请求,设置参数 request = WebRequest.Create(url) as HttpWebRequest; request.Method = "POST"; //request.ContentType = "application/x-www-form-urlencoded";
request.ContentType = "text/xml";//注意了,上面的那种方式不可采用,因为当遇到xml格式的就会报远程服务器错误。500 byte[] data = encoding.GetBytes(url); request.ContentLength = data.Length; outstream = request.GetRequestStream(); outstream.Write(data, 0, data.Length); outstream.Flush(); outstream.Close(); //发送请求并获取相应回应数据 response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 instream = response.GetResponseStream(); sr = new StreamReader(instream, encoding); //返回结果网页(html)代码 string content = sr.ReadToEnd();
return content; } }

C#运用实例.读取csv里面的词条,对每一个词条抓取百度百科相关资料,然后存取到数据库的更多相关文章

  1. selenium-java web自动化测试工具抓取百度搜索结果实例

    selenium-java web自动化测试工具抓取百度搜索结果实例 这种方式抓百度的搜索关键字结果非常容易抓长尾关键词,根据热门关键词去抓更多内容可以用抓google,百度的这种内容容易给屏蔽,用这 ...

  2. python简单爬虫 用beautifulsoup爬取百度百科词条

    目标:爬取“湖南大学”百科词条并处理数据 需要获取的数据: 源代码: <div class="basic-info cmn-clearfix"> <dl clas ...

  3. python简单爬虫爬取百度百科python词条网页

    目标分析:目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL:/ ...

  4. java 如何爬取百度百科词条内容(java如何使用webmagic爬取百度词条)

    这是老师所布置的作业 说一下我这里的爬去并非能把百度词条上的内容一字不漏的取下来(而是它分享链接的一个主要内容概括...)(他的主要内容我爬不到 也不想去研究大家有好办法可以call me) 例如 互 ...

  5. R语言爬虫:爬取百度百科词条

    抓取目标:抓取花儿与少年的百度百科中成员信息 url <- "http://baike.baidu.com/item/%E8%8A%B1%E5%84%BF%E4%B8%8E%E5%B0 ...

  6. 慕课爬虫实战 爬取百度百科Python词条相关1000个页面数据

    http://www.imooc.com/learn/563 spider_main.py #!/usr/bin/python # coding=utf-8 #from baike_spider im ...

  7. Python 爬虫实例(爬百度百科词条)

    爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入 ...

  8. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  9. python_爬百度百科词条

    如何爬取? 明确目标:爬取百度百科,定初始百度词条:python,初始URL:http://baike.baidu.com/item/Python,爬取数据量为1000条,值爬取简介,标题,和简介中u ...

随机推荐

  1. IOS添加多个按钮在导航栏

    UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 75.0f, 30.0f)]; UIButton * ...

  2. Selenium模块化

    概述 高内聚低耦合是软件设计的一个基本原则. 内聚:从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事.它描述的是模块内的功能联系. 耦合:各模块之间相互连接的一种度量,耦合强弱取决于模块 ...

  3. C++中如何建立一个顺序表

    准备数据 #define MAXLEN 100 //定义顺序表的最大长度 struct DATA { char key[10]; //结点的关键字 char name[20]; int age; }; ...

  4. LDAP启动cacao提示Invalid file permission

    问题处理步骤: 1.LDAP实例停止 2.DSCC控制台启动,提示cacao已停止…… 3.启动caocaoroot@rusky bin]# ./cacaoadm startInvalid file ...

  5. tail

    tail用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理.常用查看日志文件. -f 循环读取 -q 不显示处理信息 -v 显示详细的处理信息 -c<数目> 显示的字节数 -n& ...

  6. ASP.net+SQL server2008简单的数据库增删改查 VS2012

    工具:VS2012 数据库:SQL server 简单说明:根据老师上课给的代码,进行了简单的改正适用于VS2012环境,包括注册.登录.查询.修改.删除功能,多数参考了网上的代码 百度云源代码连接t ...

  7. android一些常用的代码2(收藏)

    1.收集设备信息,用于信息统计分析 public static Properties collectDeviceInfo(Context context) { Properties mDeviceCr ...

  8. 利用JQuery实现全选和反选的几种方法

    前面介绍了利用JavaScript实现全选功能,其中也有要注意的几点,现在讲解下在JQuery怎么实现全选和反选,下面提供了两种方法实现. 如图:要实现的效果是点击全选框全部选中,再点击全部不选中 方 ...

  9. 新博客 Fighting

    C3  Viso绘图 的 几种关系

  10. python- 如何return返回多个值

    函数的return 语句只能返回一个值,可以是任何类型. 因此,我们可以“返回一个 tuple类型,来间接达到返回多个值 ”. 例:   x 除以 y 的余数与商的函数 def    F1 ( x, ...