.Net生成站点sitemap供百度抓取的类和使用
我对sitemap介绍:
百度的sitemap说明地址:http://zhanzhang.baidu.com/wiki/93#01
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的类
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);