1:输入某人的BLOG,例如http://www.cnblogs.com/JeffreyZhao/。
2:任意打开一篇博客文章,例如:http://www.cnblogs.com/JeffreyZhao/archive/2010/03/21/async-and-parallel-design-patterns-in-fsharp-3-more-agents.html
3:我们看到了博客文章的url格式大致是,http://www.cnblogs.com/JeffreyZhao/+%22archive"+年+月+日+文章标题+".html"
4:OK,我们输入http://www.cnblogs.com/JeffreyZhao/archive/2010/03.html。发现显示的是随笔档案 - 2010年3月。这就意味着我们可以通过更改年月来得到相应的年月的随笔档案。
5:我们从2005年01月一直搜索到2010年12月.构造我们需要搜索的地址列表。储存到httpCategoryUrls这样的List<string>.
代码
for
(
int
i
=
2005
; i
<
2011
; i
++
)
{
for
(
int
j
=
1
; j
<
13
; j
++
)
{
httpCategoryUrls.Add(textBox1.Text.ToString()
+
"
archive/
"
+
i
+
"
/
"
+
(j
<
10
?
(
"
0
"
+
j).ToString() : j.ToString())
+
"
.html
"
);
}
}
6:逐个解析我们的httpCategoryUrls里面的url,采用foreach进行遍历。
代码
foreach
(
string
rurl
in
httpCategoryUrls)
{
url myurl;
Http myhttp
=
new
Http();
Spider myspider
=
new
Spider();
try
{
myurl
=
new
url(rurl);
Uri burl
=
new
Uri(rurl);
myspider.ProsessPage(myhttp.GetPage(burl));
}
catch
{
return
false
; }
while
(myspider.outurl.Count
>
0
)
{
string
urlValue
=
myspider.outurl.Dequeue().ToString();
if
(
!
httpArticleUrls.Contains(urlValue)
&&
urlValue.Contains(
"
archive
"
)
&&
urlValue.EndsWith(
"
.html
"
)
&&
Path.GetFileName(urlValue).Length
>
9
)
{
httpArticleUrls.Add(urlValue);
}
}
}
其中随便找了个网上的spider组件,可以解析html得到html中的所有链接信息。
因为我们知道文章的url中包含"archive",并且url以.html结尾,
为了防止http://www.cnblogs.com/JeffreyZhao/archive/2010/03.html,这样的连接,我做了Length检查。
通过上述基本的几个步骤大致可以得到某人某年某月的随笔档案。全部保存到httpArticleUrls的List<string>中。
7:已经得到了某人的从2005年到2010年之间的所有文章了,剩下的就是发送Http请求去获取数据,然后本地保存了。
保存采用的是CDOMessage这样的类,该类可以生成MHTML格式的文档。代码如下:
代码
foreach
(
string
str
in
httpArticleUrls)
{
CDO.Message message
=
new
CDO.MessageClass();
message.MimeFormatted
=
true
;
message.CreateMHTMLBody(str, CDO.CdoMHTMLFlags.cdoSuppressNone,
""
,
""
);
ADODB.Stream stream
=
message.GetStream();
int
startIndex
=
message.HTMLBody.IndexOf(
"
<title>
"
, StringComparison.CurrentCultureIgnoreCase);
int
endIndex
=
message.HTMLBody.IndexOf(
"
</title>
"
, StringComparison.CurrentCultureIgnoreCase);
string
fileName
=
FilePath
+
"
\\1.mht
"
;
try
{
Char[] chars
=
Path.GetInvalidFileNameChars();
string
name
=
message.HTMLBody.Substring(startIndex
+
7
, endIndex
-
startIndex
-
7
);
foreach
(
char
c
in
chars)
{
name
=
name.Replace(c.ToString(),
string
.Empty);
}
fileName
=
FilePath
+
"
\\
"
+
name
+
"
.mht
"
;
}
catch
{ }
stream.SaveToFile(fileName, ADODB.SaveOptionsEnum.adSaveCreateOverWrite);
stream.Close();
}
文章的以文章的标题为名字进行保存。如果文章的名称中包含非法的字符,进行替换。
CDO.CdoMHTMLFlags.cdoSuppressNone:代表不进行压缩。这样图片可以嵌入其中。
8:大致功能已经实现,但是代码还有很多地方可以优化的,名称命名等都可以进行修改下,速度,效率啊目前都还没考虑,没有自动下载附件的功能,需要的话其实也挺简单的,得到所有文章中的压缩文件,通过WebClient.DownLoadFile方法下载等。
9:附件下载:BlogDownLoader.rar