.Net生成站點sitemap供百度抓取的類和使用
我對sitemap介紹:
SiteMap作用:利於百度搜索
舉例說明:
http://award.kinpan.com/AwardsIntroduce/AwardNews/20130609172732828125097a79b4e4a
http://award.kinpan.com/AwardsIntroduce/AwardNews/20130624102726828125093ba40f210
http://award.kinpan.com/AwardsIntroduce/AwardNews/201306241038078125000d72ba2d9fe
http://award.kinpan.com/AwardsIntroduce/AwardNews/20130624104148890625018d09da3eb
……………………………………………………………………………………………………
像上面這類網址,如果網站某列表頁面有出現連結,百度會抓取,但是一般的列表頁面只出現最新的幾個,百度自動搜尋網站上的頁面,只能搜尋到:http://award.kinpan.com/AwardsIntroduce/AwardNews,大部分帶有id的詳細頁面還是不會出現,所以,我們生成所有詳細內容頁面的地址去給百度抓取,那麼所有這些頁面的內容就能被百度收錄,自然在搜尋時就能搜尋出來了。主要內容官方說明:
1.第一種格式樣例:txt文字格式
在一個txt文字列明需要向百度提交的連結地址,將txt文字檔案通過站長平臺進行提交
http://www.example.com/repaste/101562698_5230191316.html
http://www.example.com/repaste/101586283_5230215075.html
http://www.example.com/repaste/101639435_5230310576.html
此文字檔案需要遵循以下指南:
- 文字檔案每行都必須有一個網址。網址中不能有換行。不應包含網址列表以外的任何資訊。
- 您必須書寫完整的網址,包括 http。
- 每個文字檔案最多可包含 50,000 個網址,並且應小於10MB(10,485,760位元組)。如果網站所包含的網址超過 50,000 個,則可將列表分割成多個文字檔案,然後分別新增每個檔案。
- 文字檔案需使用 UTF-8 編碼或GBK編碼。
2.第二種格式樣例:xml格式
您先了解單個xml資料格式如下:
<?xml version="1.0" encoding="utf-8"?> |
XML檔案需以utf-8編碼 |
<urlset> |
必填,這是整個連結集合的定義入口,以<urlset>作為開始,</urlset>作為結束 |
<url> |
必填,這是具體某一個連結的定義入口,每一條資料都要用<url>和</url>包含在裡面。 |
<loc>http://www.yoursite.com/yoursite.html</loc> |
必填,頁面連結地址,長度不得超過256位元組。 |
<lastmod>2009-12-14</lastmod> |
選填,用來指定該連結的最後更新時間 |
<changefreq>daily</changefreq> |
選填,用這個標籤告訴此連結可能會出現的更新頻率 |
<priority>0.8</priority> |
選填,可以不提交該標籤,用來指定此連結相對於其他連結的優先權比值,此值定於0.0-1.0之間 |
</url> |
必填,標籤閉合 |
</urlset> |
必填,標籤閉合 |
上述xml sitemap向百度提交了一個url:http://www.yoursite.com/yoursite.html
若有多條url,按照上述格式重複<url></url>之間的片斷,列明所有url地址,打包到一個xml檔案,向站長平臺進行提交。
3.第三種格式樣例:Sitemap索引格式
如需提交大量sitemap檔案,則可將其列在sitemap索引檔案中,然後將該索引檔案提交。您無需分別提交每個檔案。
<?xml version="1.0" encoding="UTF-8" ?> |
XML檔案需以utf-8編碼 |
<sitemapindex> |
必填,以 <sitemapindex> 開始標記作為開始,以 </sitemapindex> 結束標記作為結束 |
<sitemap> |
必填,以<sitemap>標籤提交一個子sitemap檔案 |
<loc>http://example.com/ext/xmlsitemap/add/201201/index_20120106.xml</loc> |
必填,識別sitemap的位置 |
<lastmod>2012-01-06</lastmod> |
選填,識別相對sitemap檔案的修改時間 |
</sitemap> |
必填,標籤閉合 |
</sitemapindex> |
必填,標籤閉合 |
有多個sitemap,按上述格式重複<sitemap></sitemap>之間的片斷,列明所有sitemap地址,向站長平臺進行提交。
如果網址超過50000條或檔案大小超過10M,就要分隔成KinpanUrl1.xml、KinpanUrl2.xml……
那麼KinpanUrl.xml就是存放KinpanUrl1.xml、KinpanUrl2.xml……的路徑,這個檔案很小。
在百度提交網址就是提交KinpanUrl.xml,百度會根據KinpanUrl.xml裡面的地址去獲取KinpanUrl1.xml、KinpanUrl2.xml……裡面的網址。
我這裡做了另外的優化,把所有子站點的生成sitemap的連結放到一起,簡化生成步驟,還加入了10分鐘只能生成一次的限制,防止惡意生成,因為生成sitemap就是要把整個資料庫的內容對應的要顯示的頁面都查找出來告訴百度,資料庫查詢比較耗資源。//生成sitemap的類
/// <summary>
/// 建立站點sitemap的類
/// </summary>
public class CreateSiteMapTxt
{
public CreateSiteMapTxt() { }
private static CreateSiteMapTxt _Instance = null;
/// <summary>
/// 靜態物件例項
/// </summary>
public static CreateSiteMapTxt Instance
{
get
{
if (_Instance == null) _Instance = new CreateSiteMapTxt();
return _Instance;
}
}
#region 建立站點的sitemap網址導航檔案
/// <summary>
/// 建立站點的sitemap網址導航檔案
/// </summary>
/// <returns>
/// 成功返回空,失敗返回錯誤資訊
/// </returns>
public string CreateTxt()
{
try
{
ConfigSiteUrl site = GetSiteByDefaultControl();
switch (site)
{
case ConfigSiteUrl.KinpanUrl:
{
#region 新增網址
List<string> list = new List<string>();
list.Add("/");//主頁
list.Add("/InfoNews");
list.Add("/InfoNews?typeID=1");
list.Add("/InfoNews?typeID=2");
NewsTopicBLL bll = new NewsTopicBLL();
List<string> listtemp = bll.GetIDs(1);
foreach (string id in listtemp)
{
list.Add("/NewsDescription/Index/" + id);
}
bll.Dispose();
createSiteXml(list, site);
#endregion
}
break;
case ConfigSiteUrl.KinpanAwardUrl:
{
#region 新增網址
List<string> list = new List<string>();
list.Add("/");//主頁
int sessionAward = new TangArt.GoldOnPubPlatform.App.Models.XmlHandler().GetXmlSession("~/Upload/Session.xml");
list.Add("/AwardsIntroduce/");//本屆金盤獎頁面
for (int i = 1; i < sessionAward; i++)
{
list.Add("/Awardsreview/Index/" + i);//歷屆金盤獎頁面
}
list.Add("/Enroll");//評選申報表
list.Add("/audienceReg");//觀眾報名
list.Add("/CurrentIntroduce/");//關於金盤獎
NewsTopicBLL bll = new NewsTopicBLL();
List<string> listtemp = bll.GetIDs(2);//金盤獎新聞
foreach (string id in listtemp)
{
list.Add("/AwardsIntroduce/AwardNews/" + id);
}
bll.Dispose();
GuestinformationBLL GuestInfo_Bll = new BLL.GuestinformationBLL();
var guest_info = GuestInfo_Bll.GetServalRecoard(0, 1, sessionAward.ToString());//本屆嘉賓
foreach (var item in guest_info)
{
list.Add("/Guest/Index/" + item.ID);
}
var ActivityLive = GuestInfo_Bll.GetServalRecoard(0, 2, (sessionAward - 1).ToString());//11表示獲取11條資料,2表示活動現場,session表示當前屆數
foreach (var item in ActivityLive)
{
list.Add("/Guest/Index/" + item.ID);
}
GuestInfo_Bll.Dispose();
AwardSubClasicBLL AC_BLL = new AwardSubClasicBLL();
var SubClasic = AC_BLL.GetByRefAwardClassMainID(sessionAward, 0);
for (int i = 0; i < SubClasic.Count; i++)
{
list.Add("/WebVote/Index/" + (i + 1));
}
AC_BLL.Dispose();
ActivityFlowClassificationBLL activity_bll = new BLL.ActivityFlowClassificationBLL();
var AwardWeek = activity_bll.GetAwardWeek(12, sessionAward);//12表示獲取活動周新聞,session表示屆數
foreach (var item in AwardWeek)
{
list.Add("/AwardsIntroduce/AwardDescription/" + item.ID);
}
activity_bll.Dispose();
kinpanAwardProjectBLL A_BLL = new kinpanAwardProjectBLL();
var kinpanAwardProjects = A_BLL.GetAll();
foreach (var item in kinpanAwardProjects)
{
list.Add("/WebVoteDetails/Index/" + item.ID);//所有金盤獎專案
}
A_BLL.Dispose();
createSiteXml(list, site);
#endregion
}
break;
case ConfigSiteUrl.TopicUrl:
{
#region 新增網址
List<string> list = new List<string>();
list.Add("/");//主頁
list.Add("/TopicList");
list.Add("/TopicList?hotOrNew=1");
TopicInformationBLL iTopicInformationBll = new TopicInformationBLL();
var listtemp = iTopicInformationBll.GetAll();
foreach (var item in listtemp)
{
list.Add("/TopicDetail/Index/" + item.ID);
}
iTopicInformationBll.Dispose();
createSiteXml(list, site);
#endregion
}
break;
case ConfigSiteUrl.ExhibitionUrl:
{
#region 新增網址
List<string> list = new List<string>();
list.Add("/");//主頁
list.Add("/Aboutus?id=1&classID=2013041714244184765625a6ac8f1f3");//展會介紹
list.Add("/AboutUs?id=1&classID=2013041714245473828129b784c41ac");//關於我們
list.Add("/ExhibitorsReg?id=2&classID=201304171425249550781926eb9025e");//參展商登記
list.Add("/ExhibiWeChoose?id=2&classID=2013041714251700683594951e43c45");//為什麼選擇我們
list.Add("/ActivitiesRow?id=2&classID=201304171425317929687756f9fd18e");//活動安排
list.Add("/ExhibiWeChoose?id=2&classID=2013041714253846191409b4a796120");//展點陣圖
list.Add("/ExhibiWeChoose?id=2&classID=20130417142545844726507e95c8997");//收費標準
list.Add("/ExhibiWeChoose?id=2&classID=201304171425531689453bac4bc46ee");//廣告贊助
list.Add("/ExhibitionManual?id=2&classID=201304171425598222656df75fa0cef");//參展商手冊
list.Add("/ExhibiReg?id=3&classID=201304171426340244140e4260ea374");//參觀登記
list.Add("/ExhibitionActivity?id=3&classID=201304171426268144531394568690f");//展會活動
list.Add("/hotelService?id=3&classID=20130417142648191406298eae94aa0");//酒店交通
list.Add("/hotelService?id=3&classID=2013041714264146289066ff9c76a91");//現場服務
list.Add("/ExhibitionDownLoad?id=5");//下載專區
list.Add("/ContactUs?id=7&classID=2013061816191867506073b036b8afc");//聯絡我們
list.Add("/NewsDynamic?id=4");//新聞媒體
list.Add("/NewsDynamic?id=4&newsType=1&classID=2013041714271025195311627d7a0f6");//展會動態
list.Add("/NewsDynamic?id=4&newsType=2&classID=201304171427171025390e6c540a6fe");//行業新聞
list.Add("/NewsMedia?id=4&classID=201304171427242744140985b276cbe");//合作媒體
ExhibitionNewsBLL exh_newsBll = new ExhibitionNewsBLL();
var listtemp = exh_newsBll.GetAll();//展會的新聞
foreach (var item in listtemp)
{
list.Add("/Exhibition/ExhibitionNewsDescription/" + item.ID);
}
exh_newsBll.Dispose();
createSiteXml(list, site);
#endregion
}
break;
case ConfigSiteUrl.MagazineUrl:
{
#region 新增網址
List<string> list = new List<string>();
list.Add("/");//主頁
list.Add("/Magazine/Magazine/sdlp/");//時代樓盤
list.Add("/Magazine/MagazineReView/sdlp/");
list.Add("/Magazine/MagazineReaderBack/sdlp/");
list.Add("/Magazine/MagazineActivity/sdlp/");
list.Add("/Magazine/Magazine/sdkj/");//時代空間
list.Add("/Magazine/MagazineReView/sdkj/");
list.Add("/Magazine/MagazineReaderBack/sdkj/");
list.Add("/Magazine/MagazineActivity/sdkj/");
list.Add("/Magazine/Magazine/chyue/");//超越
list.Add("/Magazine/MagazineReView/chyue/");
list.Add("/Magazine/MagazineReaderBack/chyue/");
list.Add("/Magazine/MagazineActivity/chyue/");
MagazineBookInfoBLL magazine_bll = new BLL.MagazineBookInfoBLL();
var sdlp = magazine_bll.GetIDsByTag("sdlp");
foreach (var item in sdlp)
{
list.Add("/Magazine/MagazineEachperiod/sdlp?id=" + item);
}
var sdkj = magazine_bll.GetIDsByTag("sdkj");
foreach (var item in sdkj)
{
list.Add("/Magazine/MagazineEachperiod/sdkj?id=" + item);
}
var chyue = magazine_bll.GetIDsByTag("chyue");
foreach (var item in chyue)
{
list.Add("/Magazine/MagazineEachperiod/chyue?id=" + item);
}
magazine_bll.Dispose();
createSiteXml(list, site);
#endregion
}
break;
case ConfigSiteUrl.LiveUrl:
{
#region 新增網址
List<string> list = new List<string>();
list.Add("/");//主頁
list.Add("/livevideo");//視訊直播
AwardLivePictureBLL AP_BLL = new BLL.AwardLivePictureBLL();
var Videos = AP_BLL.GetOrderByTime();//直播視訊列表
foreach (var item in Videos)
{
list.Add("/LiveVideo/index/" + item.ID);
}
AP_BLL.Dispose();
createSiteXml(list, site);
#endregion
}
break;
}
return "";
}
catch (Exception ex)
{
// throw ex;
return ex.Message;
}
}
private void createSiteXml(List<string> list, ConfigSiteUrl site)
{
string domain = ConfigurationManager.AppSettings[site.ToString()];
string SiteMapIndexPath = HttpContext.Current.Server.MapPath("/Upload/SiteMap/" + site.ToString() + ".xml");
if (File.Exists(SiteMapIndexPath))
{
FileInfo F_sitemapindex = new FileInfo(SiteMapIndexPath);
if (F_sitemapindex.LastWriteTime.AddMinutes(10) > DateTime.Now)
{
throw new Exception(string.Format("上次生成時間:{0},兩次生成時間至少相隔10分鐘,請不要生成太頻繁!", F_sitemapindex.LastWriteTime));
}
}
int allcount = list.Count;
XmlDocument doc_index = new XmlDocument();
XmlDeclaration dec_index = doc_index.CreateXmlDeclaration("1.0", "utf-8", null);
doc_index.AppendChild(dec_index);
XmlElement sitemapindex = doc_index.CreateElement("sitemapindex");
XmlDocument doc = null;
XmlElement Root = null;
int cur_mod = 0;
const int sitecountPerFile = 46000;//大概是10M,每個檔案最多50000個網址
int j = 1;
for (int i = 0; i < allcount; i++)//迴圈建立xml網址檔案
{
cur_mod = (i + 1) % sitecountPerFile;//
if (cur_mod == 1)//第一個,建立新的xml檔案
{
doc = new XmlDocument();
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(dec);
Root = doc.CreateElement("urlset");
}
XmlElement url = doc.CreateElement("url");//一個網址的節點
XmlElement url_1_loc = doc.CreateElement("loc");
url_1_loc.InnerText = domain + list[i];//頁面地址
XmlElement url_2_lastmod = doc.CreateElement("lastmod");
url_2_lastmod.InnerText = DateTime.Now.ToString();//內容最後更新時間
XmlElement url_3_changefreq = doc.CreateElement("changefreq");
url_3_changefreq.InnerText = "daily";//可能更新的頻率
XmlElement url_4_priority = doc.CreateElement("priority");
url_4_priority.InnerText = "1";//權重(0~1之間)
url.AppendChild(url_1_loc);
url.AppendChild(url_2_lastmod);
url.AppendChild(url_3_changefreq);
url.AppendChild(url_4_priority);
Root.AppendChild(url);
if (cur_mod == 0 || i == allcount - 1)//最後一個,儲存xml網址檔案
{
doc.AppendChild(Root);
string SiteMapDir = HttpContext.Current.Server.MapPath("/Upload/SiteMap");
Common.Upload.CreateDir(SiteMapDir);
string sitemap_fileName = site.ToString() + j + ".xml";
string path = Path.Combine(SiteMapDir, sitemap_fileName);
doc.Save(path);//sitemap檔案
XmlElement sitemap = doc_index.CreateElement("sitemap");
XmlElement loc_index = doc_index.CreateElement("loc");
loc_index.InnerText = domain + "/Upload/SiteMap/" + sitemap_fileName;//sitemap地址
XmlElement lastmod_index = doc_index.CreateElement("lastmod");
lastmod_index.InnerText = DateTime.Now.ToString();//內容最後更新時間
sitemap.AppendChild(loc_index);
sitemap.AppendChild(lastmod_index);
sitemapindex.AppendChild(sitemap);
j++;
}
}
doc_index.AppendChild(sitemapindex);
doc_index.Save(SiteMapIndexPath);//sitemap索引檔案
}
#endregion
#region 根據配置檔案獲取當前網站的子站域名
/// <summary>
/// 根據配置檔案獲取當前網站的子站域名
/// </summary>
/// <returns></returns>
public static ConfigSiteUrl GetSiteByDefaultControl()
{
string DefaultControl = ConfigurationManager.AppSettings["DefaultControl"].ToLower();
switch (DefaultControl)
{
case "index":
return ConfigSiteUrl.KinpanUrl;
case "awards":
return ConfigSiteUrl.KinpanAwardUrl;
case "exhibition":
return ConfigSiteUrl.ExhibitionUrl;
case "magazine":
return ConfigSiteUrl.MagazineUrl;
case "onlinepub":
return ConfigSiteUrl.TopicUrl;
case "awardlivehome":
return ConfigSiteUrl.LiveUrl;
default:
return ConfigSiteUrl.Default;
}
}
#endregion
//呼叫,我這個是分站生成的,在web.config中的appsettings下面配置各子站點的網址:
bool isright = false;
string str = "";
if (Request.UrlReferrer != null)
{
string host = Request.UrlReferrer.Host.ToLower();
if (host=="localhost"||host.EndsWith("test.com"))//自己網頁上鍊接過來的才生成,防止惡意生成。
{
isright = true;
}
}
if (isright)
{
string Info = CreateSiteMapTxt.Instance.CreateTxt();
if (Info == "")
{
str = "生成成功" + DateTime.Now.ToString() + "<br/><br/>";
ConfigSiteUrl site = CreateSiteMapTxt.GetSiteByDefaultControl();
str = str + "當前生成的sitemap檔案:" + ConfigurationManager.AppSettings[site.ToString()] + "/Upload/SiteMap/" + site.ToString() + ".xml <br/><br/><br/>";
}
else
{
str = "失敗:" + Info + DateTime.Now.ToString() + "<br/><br/>";
}
}
else
{
str = "請點選下面的連結生成sitemap檔案" + DateTime.Now.ToString() + "<br/><br/>";
}
List<ConfigSiteUrl> list = new List<ConfigSiteUrl>();
list.Add(ConfigSiteUrl.ExhibitionUrl);
list.Add(ConfigSiteUrl.KinpanAwardUrl);
list.Add(ConfigSiteUrl.KinpanUrl);
list.Add(ConfigSiteUrl.LiveUrl);
list.Add(ConfigSiteUrl.TopicUrl);
list.Add(ConfigSiteUrl.MagazineUrl);
str = str + string.Format("<font color='red'>提示:</font><br/>");
foreach (var site in list)
{
string siteurl = ConfigurationManager.AppSettings[site.ToString()];
str = str + string.Format("網址:{0} <br/>sitemap檔案地址:{1} <a href='{0}/index/SiteMap'>點選生成</a><br/><br/>", siteurl, siteurl + "/Upload/SiteMap/" + site.ToString() + ".xml");
}
string thisurl = Request.Url.AbsolutePath;
str = str +string.Format("<a href='{0}'>點選生成當前站點sitemap</a><br/><br/>",thisurl);