HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
WebResponse resp = req.GetResponse();
if (!resp.ContentType.ToLower().StartsWith("text/"))
{
SaveBinaryFile(resp);
return null;
}
// 文字檔案處理...
byte[1024]。convertFilename 解析 URL 產生本地路徑並建立目錄結構。File.Create 輸出流與 GetResponseStream 輸入流。Read/Write 直到結束。
using (StreamReader reader = new StreamReader(resp.GetResponseStream()))
{
string line, buffer = "";
while ((line = reader.ReadLine()) != null) buffer += line + "\r\n";
}
SaveTextFile(buffer);
while (!spider.Quit)
{
uri = spider.ObtainWork(); // 取得下一個 URL (阻塞直到有工作)
spider.Done.WorkerBegin(); // 通知開始
string page = GetPage();
if (page != null) ProcessPage(page); // 解析連結、產生新工作
spider.Done.WorkerEnd(); // 通知結束
}
DocumentWorker 封裝單一 URL 下載與解析,ObtainWork 由佇列提供,實現生產者-消費者模式。