1、什么是网络爬虫

关于爬虫百度百科这样定义的:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。从搜索引擎开始,爬虫应该就出现了,爬虫所做的事情就是分析URL、下载WebServer返回的HTML、分析HTML内容、构建HTTP请求的模拟、在爬虫过程中存储有用的信息等等。简单点说,就是把别人网站上的东西爬下来,至于爬做什么用就看你自己了。

写网络爬虫很多语言都可以写,比如众所周知的Python以及、PHP、C、Java等等。今天我就基于.Net中的HtmlAgilityPack类写一个简单的爬虫。

2、HtmlAgilityPack类

HtmlAgilityPack 是 .NET 下的一个 HTML 解析类库。支持用 XPath 来解析 HTML 。命名空间: HtmlAgilityPack,下载地址:http://htmlagilitypack.codeplex.com/releases/view/90925

2.1基本属性

Attributes             获取节点的属性集合
ChildNodes            获取子节点集合(包括文本节点)
Closed              该节点是否已关闭(</xxx>)
ClosingAttributes         在关闭标签的属性集合
FirstChild             获取第一个子节点
HasAttributes           判断该节点是否含有属性
HasChildNodes          判断该节点是否含有子节点
HasClosingAttributes       判断该节点的关闭标签是否含有属性(</xxx class="xxx">)
Id                 获取该节点的Id属性
InnerHtml             获取该节点的Html代码
InnerText             获取该节点的内容,与InnerHtml不同的地方在于它会过滤掉Html代码,而InnerHtml是连Html代码一起输出
LastChild             获取最后一个子节点
Line                获取该节点的开始标签或开始代码位于整个HTML源代码的第几行(行号)
LinePosition            获取该节点位于第几列
Name               Html元素名
NextSibling            获取下一个兄弟节点
NodeType             获取该节点的节点类型
OriginalName           获取原始的未经更改的元素名
OuterHtml             整个节点的代码
OwnerDocument         节点所在的HtmlDocument文档
ParentNode            获取该节点的父节点
PreviousSibling          获取前一个兄弟节点
StreamPosition          该节点位于整个Html文档的字符位置
XPath               根据节点返回该节点的XPath

2.2方法

IEnumerable<HtmlNode> Ancestors();               返回此元素的所有上级节点的集合。
IEnumerable<HtmlNode> Ancestors(string name);           返回此元素参数名字匹配的所有上级节点的集合。
IEnumerable<HtmlNode> AncestorsAndSelf();            返回此元素的所有上级节点和自身的集合。
IEnumerable<HtmlNode> AncestorsAndSelf(string name);      返回此元素的名字匹配的所有上级节点和自身的集合。
HtmlNode AppendChild(HtmlNode newChild);              将参数元素追加到为调用元素的子元素(追加在最后)
void AppendChildren(HtmlNodeCollection newChildren);       将参数集合中的元素追加为调用元素的子元素(追加在最后)
HtmlNode PrependChild(HtmlNode newChild);              将参数中的元素作为子元素,放在调用元素的最前面
void PrependChildren(HtmlNodeCollection newChildren);       将参数集合中的所有元素作为子元素,放在调用元素前面
static bool CanOverlapElement(string name);             确定是否可以保存重复的元素
IEnumerable<HtmlAttribute> ChildAttributes(string name);     获取所有子元素的属性(参数名要与元素名匹配)
HtmlNode Clone();                          本节点克隆到一个新的节点
HtmlNode CloneNode(bool deep);                  节点克隆到一个新的几点,参数确定是否连子元素一起克隆
HtmlNode CloneNode(string newName);               克隆的同时更改元素名
HtmlNode CloneNode(string newName, bool deep);          克隆的同时更改元素名。参数确定是否连子元素一起克隆
void CopyFrom(HtmlNode node);                   创建重复的节点和其下的子树。
void CopyFrom(HtmlNode node, bool deep);             创建节点的副本。
XPathNavigator CreateNavigator();                  返回的一个对于此文档的XPathNavigator 
static HtmlNode CreateNode(string html);               静态方法,允许用字符串创建一个新节点
XPathNavigator CreateRootNavigator();               创建一个根路径的XPathNavigator 
IEnumerable<HtmlNode> DescendantNodes();            获取所有子代节点
IEnumerable<HtmlNode> DescendantNodesAndSelf();        获取所有的子代节点以及自身
IEnumerable<HtmlNode> Descendants();              获取枚举列表中的所有子代节点
IEnumerable<HtmlNode> Descendants(string name);        获取枚举列表中的所有子代节点,注意元素名要与参数匹配
IEnumerable<HtmlNode> DescendantsAndSelf();          获取枚举列表中的所有子代节点以及自身
IEnumerable<HtmlNode> DescendantsAndSelf(string name);    获取枚举列表中的所有子代节点以及自身,注意元素名要与参数匹配
HtmlNode Element(string name);                   根据参数名获取一个元素
IEnumerable<HtmlNode> Elements(string name);          根据参数名获取匹配的元素集合
bool GetAttributeValue(string name, bool def);            帮助方法,用来获取此节点的属性的值(布尔类型)。如果未找到该属性,则将返回默认值。
int GetAttributeValue(string name, int def);              帮助方法,用来获取此节点的属性的值(整型)。如果未找到该属性,则将返回默认值。
string GetAttributeValue(string name, string def);          帮助方法,用来获取此节点的属性的值(字符串类型)。如果未找到该属性,则将返回默认值。
HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild);     将一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系
HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild);   讲一个节点插入到第二个参数节点的后面,与第二个参数是兄弟关系
static bool IsCDataElement(string name);               确定是否一个元素节点是一个 CDATA 元素节点。
static bool IsClosedElement(string name);              确定是否封闭的元素节点
static bool IsEmptyElement(string name);                确定是否一个空的元素节点。
static bool IsOverlappedClosingElement(string text);          确定是否文本对应于一个节点可以保留重叠的结束标记。
void Remove();                            从父集合中移除调用节点
void RemoveAll();                           移除调用节点的所有子节点以及属性
void RemoveAllChildren();                       移除调用节点的所有子节点
HtmlNode RemoveChild(HtmlNode oldChild);              移除调用节点的指定名字的子节点
HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren);移除调用节点调用名字的子节点,第二个参数确定是否连孙子节点一起移除
HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild);   将调用节点原有的一个子节点替换为一个新的节点,第二个参数是旧节点
HtmlNodeCollection SelectNodes(string xpath);           根据XPath获取一个节点集合
HtmlNode SelectSingleNode(string xpath);              根据XPath获取唯一的一个节点
HtmlAttribute SetAttributeValue(string name, string value);      设置调用节点的属性
string WriteContentTo();                        将该节点的所有子级都保存到一个字符串中。
void WriteContentTo(TextWriter outText);              将该节点的所有子级都保存到指定的 TextWriter。
string WriteTo();                           将当前节点保存到一个字符串中。
void WriteTo(TextWriter outText);                  将当前节点保存到指定的 TextWriter。
void WriteTo(XmlWriter writer);

3、第一个爬虫程序

3.1在VS2017中建立一个web项目拖个服务器控件按钮上去(我VS是用2017的)

3.2后台代码及解释

/// <summary>
/// 博客园精华单机按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btntwo_Click(object sender, EventArgs e)
{
int sum = ;
for (int i = ; i < ; i++)
{ SqlDB sb = new SqlDB();
HtmlWeb wb = new HtmlWeb();
string webaddress= "";
if (i==)
{
webaddress="http://www.cnblogs.com/pick/";//为啥http://www.cnblogs.com/pick/#p10进去还是第一页
string webbbb = GetHTML(webaddress);
}
else
{
webaddress = string.Format("http://www.cnblogs.com/pick/{0}", ("#p"+i.ToString()).ToString());
string webbbb = GetHTML(webaddress);
}
try
{
HtmlDocument doc = wb.Load(webaddress); HtmlNode node = doc.GetElementbyId("post_list");
if (node != null)
{
foreach (HtmlNode hnode in node.ChildNodes)
{
if (hnode.Attributes["class"] == null || hnode.Attributes["class"].Value != "post_item")
continue;
HtmlNode hn = HtmlNode.CreateNode(hnode.OuterHtml);
//推荐
int recommend = Convert.ToInt32((hn.SelectSingleNode("//*[@class=\"diggnum\"]").InnerText).Trim());
//标题
string title = hn.SelectSingleNode("//*[@class=\"titlelnk\"]").InnerText;
//网址
string webhref = hn.SelectSingleNode("//*[@class=\"titlelnk\"]").Attributes["href"].Value.ToString();
//介绍
string introduce = hn.SelectSingleNode("//*[@class=\"post_item_summary\"]").InnerText;
string articletimetest = hn.SelectSingleNode("//*[@class=\"post_item_foot\"]").InnerText;
//发表时间(陈树义 发布于 2017 - 11 - 15 10:13 评论(41)阅读(7372)
string articletime = ((hn.SelectSingleNode("//*[@class=\"post_item_foot\"]").InnerText).Trim()).Replace("\r\n", "+");
//分割字符串
string[] st = articletime.Split('+');
//取出(发布于 2017 - 11 - 15 10:13)
string pp = (st[].ToString()).Trim();
//分割字符串
string[] qq = pp.Split(' ');
//取出(2017/11/15 10 :13)
DateTime gg = Convert.ToDateTime(qq[].ToString() + " " + qq[].ToString());
try
{
string sql = string.Format(@"insert into CnblogsList( Recommend, Title,Contents, Introduce, WebHref, ArticleTime) values({0},'{1}','{2}','{3}','{4}','{5}')", recommend, title, GetContentsString(webhref), introduce, webhref, gg);
sb.ExecuteNonQuery(sql);
sum++;
}
catch (Exception ex)
{
Response.Write(ex.Message);
} Response.Write(GetContentsString(webhref)+"<hr /> <hr />");
// 陈树义 发布于 2017 - 11 - 15 10:13 评论(41)阅读(7372)
Response.Write("推荐:" + (hn.SelectSingleNode("//*[@class=\"diggnum\"]").InnerText)+"<br />");
Response.Write("标题:" + (hn.SelectSingleNode("//*[@class=\"titlelnk\"]").InnerText) + "<br />");
Response.Write("标题对应的网址:" + (hn.SelectSingleNode("//*[@class=\"titlelnk\"]").Attributes["href"].Value.ToString()) + "<br />");
Response.Write("介绍:" + (hn.SelectSingleNode("//*[@class=\"post_item_summary\"]").InnerText) + "<br />");
Response.Write("时间:" + (hn.SelectSingleNode("//*[@class=\"post_item_foot\"]").InnerText) + "<br /><hr />");
}
}
else
{
Response.Write("节点为空 +++++ 出错节点Iiiii是:" + i.ToString() + "<br /> 网址:" + webaddress.ToString() + "<br /> 插入数据:"+ sum +"条");
return;
}
}
catch (Exception esz)
{
Response.Write(esz.Message);
} }
}

这是获取网页源码的代码

/// <summary>
/// 获取网页源码
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public string GetHTML(string url)
{
WebClient web = new WebClient();
web.Encoding = Encoding.UTF8;
string buffer = web.DownloadString(url);
return buffer;
}

上面的for循环目的是获取精华区后面页数的内容,但是效果并不是这样的

我早谷歌上F12调试发现并不是这样的额  请求地址不对。为以为在后面加?PageIndex= XX就可以实现  还是不可以 因为这是经过处理的,在Header上面有地址https://www.cnblogs.com/mvc/AggSite/PostList.aspx你们仔细就可以看到。这样做了如果页数写多了就会重复出现第一页的内容 数据库中是保存的  数据库的表结构我上图

我一弄才发现原来这个地址是博客园里面的内容时刻更新的。经过处理取出精华区的。一次去可以取出2天的内容  不管是发布在博客园首页的还是没有发布在首页的都有。我就爬虫爬了一次 试试看 这是第二个按钮的源码

 /// <summary>
/// 博客园数据最近大约2天
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void BtnNowTowDay_Click(object sender, EventArgs e)
{
int sum = ;
for (int i = ; i < ; i++)
{ //这是SqlDB类
SqlDB sb = new SqlDB();
//实例HtmlWdb
HtmlWeb wb = new HtmlWeb();
//网址
string webaddress = "";
webaddress = string.Format("https://www.cnblogs.com/mvc/AggSite/PostList.aspx?PageIndex={0}", + i);
//网页源码 有html的
string webbbb = GetHTML(webaddress);
try
{
HtmlDocument doc = wb.Load(webaddress);
//获取div[@class='post_item的上级目录
//这个可以根据节点 ID选择 建议多看一下Xpath 就好理解了
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='post_item']").SelectSingleNode(".."); //HtmlNode node = doc.GetElementbyId("#id"); if (node != null)
{
foreach (HtmlNode hnode in node.ChildNodes)
{
if (hnode.Attributes["class"] == null || hnode.Attributes["class"].Value != "post_item")
continue;
HtmlNode hn = HtmlNode.CreateNode(hnode.OuterHtml);
//推荐
int recommend = Convert.ToInt32((hn.SelectSingleNode("//*[@class=\"diggnum\"]").InnerText).Trim());
//标题
string title = hn.SelectSingleNode("//*[@class=\"titlelnk\"]").InnerText;
//网址
string webhref = hn.SelectSingleNode("//*[@class=\"titlelnk\"]").Attributes["href"].Value.ToString();
//介绍
string introduce = hn.SelectSingleNode("//*[@class=\"post_item_summary\"]").InnerText;
string articletimetest = hn.SelectSingleNode("//*[@class=\"post_item_foot\"]").InnerText;
//发表时间(陈树义 发布于 2017 - 11 - 15 10:13 评论(41)阅读(7372)
string articletime = ((hn.SelectSingleNode("//*[@class=\"post_item_foot\"]").InnerText).Trim()).Replace("\r\n", "+");
//分割字符串
string[] st = articletime.Split('+');
//取出(发布于 2017 - 11 - 15 10:13)
string pp = (st[].ToString()).Trim();
//分割字符串
string[] qq = pp.Split(' ');
//取出(2017/11/15 10 :13)
DateTime gg = Convert.ToDateTime(qq[].ToString() + " " + qq[].ToString());
try
{
string sql = string.Format(@"insert into CnblogsList( Recommend, Title,Contents, Introduce, WebHref, ArticleTime) values({0},'{1}','{2}','{3}','{4}','{5}')", recommend, title, GetContentsString(webhref), introduce, webhref, gg);
sb.ExecuteNonQuery(sql);
sum++;
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
}
else
{
Response.Write("节点为空 +++++ 出错节点Iiiii是:" + i.ToString() + "<br /> 网址:" + webaddress.ToString() + "<br /> 插入数据:" + sum + "条");
return;
}
}
catch (Exception esz)
{
Response.Write(esz.Message);
}
}
}

下面是住区自己博客园的后台

/// <summary>
/// 抓取自己博客园的
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnWY_Click(object sender, EventArgs e)
{
SqlDB sb = new SqlDB();
HtmlWeb wh = new HtmlWeb();
HtmlDocument doc = wh.Load("http://www.cnblogs.com/w5942066/");
HtmlNode node = doc.DocumentNode.SelectSingleNode("//div[@class='day']").SelectSingleNode("..");
if(node !=null)
{
foreach(HtmlNode hn in node.ChildNodes)
{
if(hn.Attributes["class"] == null || hn.Attributes["class"].Value!="day")
{
continue;
}
HtmlNode hnn = HtmlNode.CreateNode(hn.OuterHtml);
//shijian
string recommend = hnn.SelectSingleNode("//*[@class=\"dayTitle\"]").InnerText;
//标题
string title = hnn.SelectSingleNode("//*[@class=\"postTitle\"]").InnerText;
//网址
string webhref = hnn.SelectSingleNode("//*[@class=\"postTitle2\"]").Attributes["href"].Value.ToString();
//介绍
string introduce = hnn.SelectSingleNode("//*[@class=\"c_b_p_desc\"]").InnerText;
//时间
// string articletimetest = hn.SelectSingleNode("//*[@class=\"postDesc\"]").InnerText;
//发表时间(陈树义 发布于 2017 - 11 - 15 10:13 评论(41)阅读(7372)
// string articletime = ((hn.SelectSingleNode("//*[@class=\"postDesc\"]").InnerText).Trim()).Replace("\r\n", "+");
//分割字符串
//string[] st = articletime.Split('+');
//取出(发布于 2017 - 11 - 15 10:13)
//string pp = (st[1].ToString()).Trim();
//分割字符串
//string[] qq = pp.Split(' ');
//取出(2017/11/15 10 :13)
DateTimeFormatInfo dtFormat = new DateTimeFormatInfo();
dtFormat.ShortDatePattern = "yyyy年MM月dd日";
DateTime dt = Convert.ToDateTime(recommend, dtFormat);
try
{
string sql = string.Format(@"insert into CnblogsList( Recommend, Title,Contents, Introduce, WebHref, ArticleTime) values({0},'{1}','{2}','{3}','{4}','{5}')", 520, title, GetContentsString(webhref), introduce, webhref, dt);
sb.ExecuteNonQuery(sql);
}
catch (Exception ex)
{
Response.Write(ex.Message);
} }
}

  

3.3列表显示出来

这里我用的是一个原始的GridView前台页面代码

<form id="form1" runat="server">
<div class="main">
<h1 style="height:35px;line-height:30px;text-align:center;padding-top:50px;">博客园文章列表</h1><br /><hr />
<asp:GridView ID="gdMain" runat="server" Width="100%" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="ID" DataSourceID="SqlDataSource1" CellPadding="4" ForeColor="#333333" GridLines="None" PageSize="30" >
<AlternatingRowStyle BackColor="White" />
<Columns> <asp:BoundField HeaderStyle-Width="3%" ItemStyle-HorizontalAlign="Center" DataField="ID" HeaderText="编号" InsertVisible="False" ReadOnly="True" SortExpression="ID" > <HeaderStyle Width="10%"></HeaderStyle> <ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundField> <asp:BoundField ItemStyle-Wrap="false" HeaderStyle-Width="10%" ItemStyle-HorizontalAlign="Left" DataField="Title" HeaderText="标题" SortExpression="Title" >
<HeaderStyle Width="10%"></HeaderStyle> <ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundField>
<asp:BoundField ItemStyle-Wrap="false" HeaderStyle-Width="30%" ItemStyle-HorizontalAlign="left" DataField="Contents" HeaderText="内容" SortExpression="Contents" >
<HeaderStyle Width="30%"></HeaderStyle> <ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundField>
<asp:BoundField ItemStyle-Wrap="false" HeaderStyle-Width="20%" ItemStyle-HorizontalAlign="left" DataField="WebHref" HeaderText="原文网址" SortExpression="WebHref" >
<HeaderStyle Width="20%"></HeaderStyle> <ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundField>
<asp:BoundField ItemStyle-Wrap="false" HeaderStyle-Width="10%" ItemStyle-HorizontalAlign="Center" DataField="ArticleTime" HeaderText="时间" SortExpression="ArticleTime" >
<HeaderStyle Width="10%"></HeaderStyle> <ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundField>
<asp:HyperLinkField DataNavigateUrlFields="ID"
DataNavigateUrlFormatString="PageInfo.aspx?ID={0}" HeaderStyle-Width="5%" ItemStyle-HorizontalAlign="Center"
Text="详细" DataTextFormatString="详细" Target="_blank"/>
</Columns> <EditRowStyle BackColor="#2461BF" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<PagerSettings PageButtonCount="30" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#EFF3FB" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" Wrap="False" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TestBaseConnectionString %>" SelectCommand="select ID,SUBSTRING(Title,0,30)AS Title,SUBSTRING(Contents,0,30)AS Contents ,SUBSTRING(Webhref,0,20)AS WebHref , ArticleTime from CnblogsList"></asp:SqlDataSource>
</div>
</form>

后台部分

namespace NetCrawlerTest.Winfrom
{
public partial class CnblogListData : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//if(!IsPostBack)
//{
// GetData();
//}
}
public void GetData()
{
SqlDB sb = new SqlDB();
string _Sql = "select ID,SUBSTRING(Title,0,50)AS Title,SUBSTRING(Contents,0,60)AS Contents ,SUBSTRING(Webhref,0,50)AS WebHref , ArticleTime from CnblogsList";
gdMain.DataSource = sb.ExecuteDataSet(_Sql).Tables[];
gdMain.DataBind();
}
}
}

好了来看看效果

3.4具体的博客显示

前台代码就是上面图片中的PageInfo页面

 <form id="form1" runat="server">
<div class="main">
<h1 style="height:35px;line-height:30px;text-align:center; padding-top:50px"><%=GetTitle() %></h1><br />
<div style="text-align:right;">
<a href="CnblogListData.aspx" target="_parent">返回列表</a>&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
<a href="PageInfo.aspx?ID=<%=UpIDS() %>" style="width:100px; ">上一条</a>&nbsp &nbsp | &nbsp &nbsp
<a href="PageInfo.aspx?ID=<%=UpIDX() %>" style="width:100px;">下一条</a>&nbsp &nbsp </div><hr /> <div style="text-align:center;">发表时间:<%=GetTime() %></div><br />
<div style="margin:10px 10px 30px 10px"><%=GetContens() %></div><br />
<div style="text-align:right"><a href="<%= GetWebhref() %>" target="_blank">原文链接:</a><%= GetWebhref() %></div><br /><hr />
<div style="text-align:right;">
<a href="CnblogListData.aspx" target="_parent">返回列表</a>&nbsp &nbsp &nbsp &nbsp &nbsp &nbsp
<a href="PageInfo.aspx?ID=<%=UpIDS() %>" style="width:100px; ">上一条</a>&nbsp &nbsp | &nbsp &nbsp
<a href="PageInfo.aspx?ID=<%=UpIDX() %>" style="width:100px;">下一条</a>&nbsp &nbsp </div> </div>
<div style="height:50px;text-align:center;color:#fbe8e8;background-color:#000000;width:100%;line-height:50px;font-weight:600; position:fixed; border-bottom:2px #ffffff solid; bottom:0px;">行到水穷处,坐看云起时!转载声明:技术需要共享,欢迎转载!但请注明版权及出处!
</div> </form>

后台代码

  public partial class PageInfo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
SqlDB sb = new SqlDB();
//public int Sum = 0;
/// <summary>
/// 获取标题
/// </summary>
/// <returns></returns>
public string GetTitle()
{
string _sql = string.Format(@"SELECT TITLE FROM CNBLOGSLIST WHERE ID={0}", GetID());
return sb.ExecuteDataTable(_sql).Rows[][].ToString(); }
/// <summary>
/// 接收ID
/// </summary>
/// <returns></returns>
public int GetID()
{
return Convert.ToInt32(Request.QueryString["ID"].ToString());
}
/// <summary>
/// 获取时间
/// </summary>
/// <returns>时间</returns>
public string GetTime()
{
string _sql = string.Format(@"SELECT ARTICLETIME FROM CNBLOGSLIST WHERE ID={0}", GetID());
return sb.ExecuteDataTable(_sql).Rows[][].ToString();
}
/// <summary>
/// 获取内容
/// </summary>
/// <returns>内容</returns>
public string GetContens()
{
string _sql = string.Format(@"SELECT CONTENTS FROM CNBLOGSLIST WHERE ID={0}", GetID());
return (sb.ExecuteDataTable(_sql).Rows[][].ToString()).Replace("&prime", "'") ;
}
/// <summary>
/// 获取原网址
/// </summary>
/// <returns>网址</returns>
public string GetWebhref()
{
string _sql = string.Format(@"SELECT WEBHREF FROM CNBLOGSLIST WHERE ID={0}", GetID());
return sb.ExecuteDataTable(_sql).Rows[][].ToString();
}
/// <summary>
/// 上一条
/// </summary>
/// <returns>上一条信息的ID</returns>
public int UpIDS()
{
try
{
string _sql = string.Format(@"SELECT top 1 ID FROM CNBLOGSLIST AS n WHERE n.ID < {0} ORDER BY n.ID DESC ", GetID());
if (sb.ExecuteDataTable(_sql).Rows[][].ToString() != null)
{
return Convert.ToInt32(sb.ExecuteDataTable(_sql).Rows[][].ToString());
}
else
{
return GetID();
}
}
catch(Exception)
{
return GetID();
} }
/// <summary>
/// 下一条
/// </summary>
/// <returns>下一条信息的ID</returns>
public int UpIDX()
{
try
{ string _sql = string.Format(@"SELECT top 1 ID FROM CNBLOGSLIST AS n WHERE n.ID > {0} ORDER BY n.ID ASC ", GetID()); if (sb.ExecuteDataTable(_sql).Rows[][].ToString() != null)
{
return Convert.ToInt32(sb.ExecuteDataTable(_sql).Rows[][].ToString());
}
else
{
return GetID();
}
}
catch(Exception)
{
return GetID();
}
}

这些代码都很基础就不一一解释了 实现的效果还是可以的,文字都在 ,大部分的图片都显示不出来

希望看到的朋友能有所收获,别拿去干坏事  也干不了啥坏事,其他的网站维护你就弄不到了还要研究的。对此感谢博客园提供平台让我学有所获。初学者,大神勿喷谢谢!有兴趣的朋友不懂的可以留言。

ASP.NET网络爬虫小研究 HtmlAgilityPack基础,爬取数据保存在数据库中再显示再自己的网页中的更多相关文章

  1. Python网络爬虫第三弹《爬取get请求的页面数据》

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  2. python网络爬虫之scrapy 调试以及爬取网页

    Shell调试: 进入项目所在目录,scrapy shell “网址” 如下例中的: scrapy shell http://www.w3school.com.cn/xml/xml_syntax.as ...

  3. 【Python网络爬虫四】通过关键字爬取多张百度图片的图片

    最近看了女神的新剧<逃避虽然可耻但有用>,同样男主也是一名程序员,所以很有共鸣 被大只萝莉萌的一脸一脸的,我们来爬一爬女神的皂片. 百度搜索结果:新恒结衣 本文主要分为4个部分: 1.下载 ...

  4. python网络爬虫之使用scrapy自动爬取多个网页

    前面介绍的scrapy爬虫只能爬取单个网页.如果我们想爬取多个网页.比如网上的小说该如何如何操作呢.比如下面的这样的结构.是小说的第一篇.可以点击返回目录还是下一页 对应的网页代码: 我们再看进入后面 ...

  5. 网络爬虫——针对任意主题批量爬取PDF

    |本文为博主原创,转载请说明出处 任务需求:要求通过Google针对任意关键字爬取大量PDF文档,如K-means,KNN,SVM等. 环境:Anaconda3--Windows7-64位--Pyth ...

  6. python3编写网络爬虫14-动态渲染页面爬取

    一.动态渲染页面爬取 上节课我们了解了Ajax分析和抓取方式,这其实也是JavaScript动态渲染页面的一种情形,通过直接分析Ajax,借助requests和urllib实现数据爬取 但是javaS ...

  7. 网络爬虫2:使用crawler4j爬取网络内容

    https://github.com/yasserg/crawler4j 需要两个包: crawler4j-4.1-jar-with-dependencies.jar slf4j-simple-1.7 ...

  8. Java网络爬虫Hello world实现——Httpclient爬取百度首页

    1.创建Maven项目 2.Httpclient Maven地址 <dependency> <groupId>org.apache.httpcomponents</gro ...

  9. Python网络爬虫案例(二)——爬取招聘信息网站

    利用Python,爬取 51job 上面有关于 IT行业 的招聘信息 版权声明:未经博主授权,内容严禁分享转载 案例代码: # __author : "J" # date : 20 ...

随机推荐

  1. K:HashMap中hash函数的作用

      在分析了hashCode方法和equals方法之后,我们对hashCode方法和equals方法的相关作用有了大致的了解.在通过查看HashMap类的相关源码的时候,发现其中存在一个int has ...

  2. [js高手之路] vue系列教程 - 绑定设置属性的多种方式(5)

    一.设置属性的值: {{data中的数据}} window.onload = function () { var c = new Vue({ el : '#box', data : { url : ' ...

  3. Anaconda使用

    转自PeterYuan   序 Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python, ...

  4. linux中搭建solr集群出现org.apache.catalina.LifecycleException: Failed to initialize component ,解决办法

    07-Jan-2018 20:19:21.489 严重 [main] org.apache.catalina.core.StandardService.initInternal Failed to i ...

  5. 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)

    在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...

  6. Excel Microsoft.Jet.OLEDB.4.0 外部数据库驱动程序中(1)的意外错误

    昨天更新系统的bug,据说是微软要搞事情啊 删除以下更新就行: win7                          KB4041678  KB4041681 SERVER 2008 R2 KB ...

  7. input表单的type属性详解,不同type不同属性之间区别

    目标:详解表单input标签type属性常用的属性值 一.input标签和它的type属性 PS:input 元素可以用来生成一个供用户输入数据的简单文本框. 在默认的情况下, 什么样的数据均可以输入 ...

  8. uboot中 make xxx_config 的作用(以make smdk2410_config为例)

    1.创建到目标板相关文件的链接 ln -s asm-arm asm ln -s arch-s3c24x0 asm-arm/arch ln -s proc-armv asm-arm/proc 2.创建i ...

  9. CCS入门基础

      1.CSS概念 全称为Cascading Style Sheets(层叠样式表),支持专有的文件 - 扩展名为".css" 作用:将HTML的结构(HTML标签即html)与样 ...

  10. <魔域>按键精灵脚本

    用了三天时间才写完,实现了通过图片识别读取坐标数值,自动寻路等简单功能. 主要的难点在于游戏中的坐标系,和电脑屏幕的坐标系存在三维旋转关系,难以换算. //全局变量:第一个数左上右下坐标 Global ...