【NET】网站数据爬取 上

接昨天的

采集内容页,要考虑两点,一个是是否需要登录才能浏览,还有一個是有些网站有限制流量的,超过了就看不了
所以需要存着网站的cookie和当前采集的次数

1
2
3
4
5
6
7
8
9
10
11
12
Dictionary<string, long> siteTakeCount = new Dictionary<string, long>();
Dictionary<string, System.Net.CookieContainer> siteTakeCookie = new Dictionary<string, System.Net.CookieContainer>();
var result = DataHandled.GetStayTakeTask();
if (ConfigManager.CollectTasks != null && ConfigManager.CollectTasks.Any())
{
foreach (var item in ConfigManager.CollectTasks)
{
long count = item.PageContent.CollectCountMax > 0 ? item.PageContent.CollectCountMax : -1;
siteTakeCount.Add(item.TaskName, count);
siteTakeCookie.Add(item.TaskName, null);
}
}

初始化采集次数和cookie后,内容页就简单了,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
string enc = task.PageContent.PageEncode;
if (string.IsNullOrWhiteSpace(enc))
enc = task.DefaultEncode;
if (task.HasCookie && siteTakeCookie[task.TaskName] == null)
siteTakeCookie[task.TaskName] = RequestManager.GetCooKie(task.CheckLogin.LoginUrl, task.CheckLogin.LoginData);
var content = RequestManager.GetPage(item.Location, enc, siteTakeCookie[task.TaskName]);
if (!string.IsNullOrWhiteSpace(content))
{
bool flag = true;
if (task.HasCookie && content.IndexOf(task.CheckLogin.LoginMark) < 0)
{
flag = false;
siteTakeCount[task.TaskName] = 0;
continue;
}
if (task.PageContent.IsSaveAsFile)
{
// 保存到本地
}
if (task.PageContent.IsSaveDataBase)
{
// 写入数据库
}
if (flag)
{
// 更新状态,显示已采集
}
}
else
{
SetLogInfo(string.Format("【{0}】-【{1}】无法获取到页面内容,地址:{2}", item.TaskName, item.Title, item.Location), LogType.Logger, LogLevelType.Error);
}

这样子就ok了,再写两个线程,一个用来采集站点,一个用来下载页面信息

1
2
3
4
5
6
7
8
9
10
11
takeTaskThread = new Thread(new ThreadStart(GetStayUrlList));
takeTaskThread.IsBackground = true;
takeTaskThread.Name = "采集地址线程";
takeTaskThread.Priority = ThreadPriority.Normal;
takeTaskThread.Start();
takeSaveThread = new Thread(new ThreadStart(GetStayPageList));
takeSaveThread.IsBackground = true;
takeSaveThread.Name = "下载页面线程";
takeSaveThread.Priority = ThreadPriority.BelowNormal;
takeSaveThread.Start();

程序运行之后,因为配置文件或其他问题,主界面会出現挂掉的问题,
这个时候就需要在程序运行前,检查下一些配置文件等,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public bool InitFormProgramRunStatus()
{
SetLogInfo("正在扫描程序配置情况,请稍等~", LogType.Logger, LogLevelType.Debug);
// 数据库配置情况
if (!DataHandled.ConnectionTest())
{
SetLogInfo("数据库连接不正确,请先设置数据连接!", LogType.Logger, LogLevelType.Fatal);
return false;
}
// 采集文件配置情况
if (string.IsNullOrWhiteSpace(ConfigManager.TaskConfigPath))
{
SetLogInfo("采集站点配置文件路径错误!", LogType.Logger, LogLevelType.Fatal);
return false;
}
string[] files = System.IO.Directory.GetFiles(ConfigManager.TaskConfigPath, "*.xml");
if (files.Count() <= 0x0)
{
SetLogInfo("未找到采集站点配置文件!", LogType.Logger, LogLevelType.Fatal);
return false;
}
ConfigManager.CollectTasks = new List<Task>();
string errFile = string.Empty;
try
{
foreach (string file in files)
{
errFile = file;
Task t = XmlHelper.XmlDeserializeFromFile<Task>(file, Encoding.UTF8);
ConfigManager.CollectTasks.Add(t);
}
}
catch (Exception ex)
{
SetLogInfo(string.Format("采集站点的配置文件序列化失败!错误文件:{0},错误代码:{1}", errFile, ex.Message), LogType.Logger, LogLevelType.Fatal);
return false;
}
// 下载文件配置情况
try
{
if (string.IsNullOrWhiteSpace(ConfigManager.SaveFilePath()) || !System.IO.Directory.Exists(ConfigManager.SaveFilePath()))
{
SetLogInfo("文件保存路径未找到,或路径配置错误!", LogType.Logger, LogLevelType.Fatal);
return false;
}
}
catch (Exception ex)
{
SetLogInfo("文件保存路径未找到,或路径配置错误!", LogType.Logger, LogLevelType.Fatal);
return false;
}
SetLogInfo("扫描成功~", LogType.Logger, LogLevelType.Debug);
return true;
}