3.3 Response 结构体

Reponse结构体是我们请求Url后返回的响应。

这个结构体被定义在context结构中,我们在通过Addqueue或者Addqueue2将任务添加到任务队列后,框架会在合适的时机将任务取出进行解析。
我们可以通过ctx.GetResponse()来获取对应的Reponse结构(ctx为*Context结构),当然,ctx结构本身也提供了很多方法用于获取url抓取好的内容。

3.3.1 Response 定义

  1. // Response represents an entity be crawled.用于装载抓取反馈的结构
  2. type Response struct {
  3. // 原始请求
  4. *Request
  5. // 响应流,其中URL拷贝自*Request
  6. *http.Response
  7. // The text is body of response. http响应的body部分
  8. text string
  9. // The dom is a pointer of goquery boject that contains html result. goquery抓取下的dom树
  10. dom *goquery.Document
  11. // The items is the container of parsed result. Restful请求的KV数据
  12. items []map[string]interface{}
  13. // The files is the container of image. Restful请求的多媒体文件
  14. // "Name": string; "Body": io.ReadCloser
  15. files []map[string]interface{}
  16. // The err is not nil when crawl process is success. 错误码
  17. err error
  18. }

3.3.2 Response 提供的一些public方法

  1. // new一个新实例
  2. func NewResponse(req *Request) *Response {
  3. }
  4. // 使用前的初始化工作
  5. func (self *Response) Prepare(resp *http.Response, req *Request) *Response {
  6. }
  7. // GetError test whether download process success or not.
  8. func (self *Response) GetError() error {
  9. return self.err
  10. }
  11. // SetError save err about download process.
  12. func (self *Response) SetError(err error) {
  13. self.err = err
  14. }
  15. // AddItem saves KV string pair to Response.Items preparing for Pipeline
  16. func (self *Response) AddItem(data map[string]interface{}) {
  17. self.items = append(self.items, data)
  18. }
  19. func (self *Response) GetItem(idx int) map[string]interface{} {
  20. return self.items[idx]
  21. }
  22. func (self *Response) GetItems() []map[string]interface{} {
  23. return self.items
  24. }
  25. // AddFile saves to Response.Files preparing for Pipeline
  26. func (self *Response) AddFile(name ...string) {
  27. }
  28. func (self *Response) GetFile(idx int) map[string]interface{} {
  29. return self.files[idx]
  30. }
  31. func (self *Response) GetFiles() []map[string]interface{} {
  32. return self.files
  33. }
  34. // GetRequest returns request oject of self page.
  35. func (self *Response) GetRequest() *Request {
  36. return self.Request
  37. }
  38. func (self *Response) GetHost() string {
  39. return self.Response.Request.URL.Host
  40. }
  41. func (self *Response) GetResponseHeader() http.Header {
  42. return self.Response.Header
  43. }
  44. func (self *Response) GetRequestHeader() http.Header {
  45. return self.Response.Request.Header
  46. }
  47. func (self *Response) GetReferer() string {
  48. return self.Response.Request.Header.Get("Referer")
  49. }
  50. // 自定义设置输出结果的"上级链接"字段
  51. func (self *Response) SetReferer(referer string) *Response {
  52. self.Response.Request.Header.Set("Referer", referer)
  53. return self
  54. }
  55. // GetHtmlParser returns goquery object binded to target crawl result.
  56. func (self *Response) GetDom() *goquery.Document {
  57. if self.dom == nil {
  58. self.initDom()
  59. }
  60. return self.dom
  61. }
  62. // GetHtmlParser returns goquery object binded to target crawl result.
  63. func (self *Response) initDom() *goquery.Document {
  64. r := strings.NewReader(self.GetText())
  65. var err error
  66. self.dom, err = goquery.NewDocumentFromReader(r)
  67. if err != nil {
  68. logs.Log.Error("%v", err)
  69. panic(err.Error())
  70. }
  71. return self.dom
  72. }
  73. // GetBodyStr returns plain string crawled.
  74. func (self *Response) GetText() string {
  75. if self.text == "" {
  76. self.initText()
  77. }
  78. return self.text
  79. }
  80. func (self *Response) ResetText(body string) *Response {
  81. self.text = body
  82. self.dom = nil
  83. return self
  84. }

如果response附带有kv数据,多媒体文件或者比较特殊的非文本响应,可以通过response获取。
如果反馈只是普通的html页面,使用ctx.GetText和ctx.GetDom就基本能够达到效果