火车采集器V9插件文档

采集器提供了插件机制,来增强数据采集、数据处理的能力。 目前插件按照功能分为3种:HTTP请求插件、内容数据插件、文件下载插件,下面介绍下C#源码类型的插件。


HTTP请求插件

可以修改HTTP请求前的请求数据(http header)和HTTP完成后的返回数据(response),这个插件包含了2个处理方法。

BeforeRequest(RequestEntry request)

这个方法会在所有HTTP请求前的调用,包括网址采集、内容采集请求,可以通过修改请求来应对一些复杂的网站抓取。

参数介绍:

  • request.Properties 属性最好只做读取操作,不要修改,不然会造成无法预料的结果。其他的RequestEntry字段请参考 [文章最后]

AfterResponse(ResponseEntry response)

这个方法在所有HTTP请求完成后调用,可以修改为自己想要的数据,然后交给采集器来处理。

参数介绍:

  • request 一样,response 也包含了 response.Properties["PageType"]、request.Properties["JobName"]、request.Properties["JobID"],含义相同。

ResponseEntry字段请参考 [文章最后]

示例插件代码:

  1. public class Plugin1 : IHTTPTamper
  2. {
  3. /// <summary>
  4. /// 处理下载前的request
  5. /// </summary>
  6. /// <param name="response"></param>
  7. public void BeforeRequest(RequestEntry request) {
  8. Console.WriteLine("BeforeRequest:"+request.Url);
  9. }
  10. /// <summary>
  11. /// 处理下载完成后的http响应,网址、默认页、多页、内容分页
  12. /// </summary>
  13. /// <param name="response"></param>
  14. public void AfterResponse(ResponseEntry response) {
  15. Console.WriteLine("AfterResponse:" + response.Url);
  16. }
  17. }

内容数据插件

通过这个插件可以修改最终的标签数据结果。

Process(ResponseEntry response, Dictionary<string, string> result)

参数介绍:

result中的值,但是不要删除、清空 result 的键,不然保存数据时可能会出错。

示例插件代码:

  1. public class Plugin2 : IResultProcesser
  2. {
  3. /// <summary>
  4. /// 处理采集后的标签结果
  5. /// </summary>
  6. /// <param name="response">默认页面的响应</param>
  7. /// <param name="result">标签结果,键为标签名称,值为标签值</param>
  8. public void Process(ResponseEntry response, Dictionary<string, string> result)
  9. {
  10. Console.WriteLine("Process:" + response.Url);
  11. var m = Regex.Match(response.RawText, "<title>(?<t>[^<]*)");
  12. if (m.Success)
  13. {
  14. Console.WriteLine(response.Url);
  15. }
  16. }
  17. }

文件下载插件

这个插件提供下载文件的相关信息,并且修改其中的某些值。

BeforeDownload(RequestEntry request, DownloadFile downloadFile)

参数介绍:

示例插件代码:

  1. public class Plugin3 : IFileDownloader
  2. {
  3. /// <summary>
  4. /// 文件下载前的处理方法
  5. /// </summary>
  6. /// <param name="request">文件下载的HTTP请求</param>
  7. /// <param name="downloadFile">下载文件</param>
  8. public void BeforeDownload(RequestEntry request, DownloadFile downloadFile)
  9. {
  10. if (downloadFile.DownlaodUrl.Contains("xxx"))
  11. {
  12. downloadFile.Cancel = true;//取消该文件的下载
  13. }
  14. }
  15. }

RequestEntry 详细字段说明

  1. public class RequestEntry
  2. {
  3. /// <summary>
  4. /// 请求的头信息
  5. /// </summary>
  6. public Dictionary<string, string> Headers { get; set; }
  7. /// <summary>
  8. /// HTTP请求的方式,GET或者POST
  9. /// </summary>
  10. public string Method { get; set; }
  11. /// <summary>
  12. /// 请求的地址
  13. /// </summary>
  14. public string Url { get; set; }
  15. /// <summary>
  16. /// 来源地址
  17. /// </summary>
  18. public string Referer { get; set; }
  19. /// <summary>
  20. /// POST数据,当Method为POST时生效
  21. /// </summary>
  22. public string PostData { get; set; }
  23. /// <summary>
  24. /// 请求编码
  25. /// </summary>
  26. public string Encoding { get; set; }
  27. }

ResponseEntry 详细字段说明

  1. public class ResponseEntry
  2. {
  3. /// <summary>
  4. /// 页面编码,比如UTF-8,GB2312
  5. /// </summary>
  6. public string ContentEncoding { get; set; }
  7. /// <summary>
  8. /// 页面类型,比如text/plain,text/html,application/xml
  9. /// </summary>
  10. public string ContentType { get; set; }
  11. /// <summary>
  12. /// 响应的HTTP头信息
  13. /// </summary>
  14. public Dictionary<string, string> Headers { get; set; }
  15. /// <summary>
  16. /// POST或者GET
  17. /// </summary>
  18. public string Method { get; set; }
  19. /// <summary>
  20. /// 来源页地址
  21. /// </summary>
  22. public string Referer { get; set; }
  23. /// <summary>
  24. /// 响应地址
  25. /// </summary>
  26. public Uri ResponseUri { get; set; }
  27. /// <summary>
  28. /// HTTP状态代码
  29. /// </summary>
  30. public HttpStatusCode StatusCode { get; set; }
  31. /// <summary>
  32. /// 请求地址
  33. /// </summary>
  34. public string Url { get; set; }
  35. /// <summary>
  36. /// HTTP响应中的原始文本
  37. /// </summary>
  38. public string RawText { get; set; }
  39. }

DownloadFile 详细字段说明

  1. public class DownloadFile
  2. {
  3. /// <summary>
  4. /// 所属的记录ID
  5. /// </summary>
  6. public int ContentId { get; set; }
  7. /// <summary>
  8. /// 原始下载地址
  9. /// </summary>
  10. public string DownlaodUrl { get; set; }
  11. /// <summary>
  12. /// 最终下载地址
  13. /// </summary>
  14. public string FinalDownloadUrl { get; set; }
  15. /// <summary>
  16. /// 文件保存路径
  17. /// </summary>
  18. public string FileName { get; set; }
  19. /// <summary>
  20. /// html中的替换路径
  21. /// </summary>
  22. public string ReplaceUrl { get; set; }
  23. /// <summary>
  24. /// 标签名称
  25. /// </summary>
  26. public string LabelName { get;set; }
  27. /// <summary>
  28. /// 所属的页面地址
  29. /// </summary>
  30. public string PageUrl { get;set; }
  31. /// <summary>
  32. /// 是否取消下载
  33. /// </summary>
  34. public bool Cancel = false;
  35. }