如果内容页有分页,该如何爬取到完整数据?

如果要爬取的某个内容页中有多个分页,该如何爬取这个内容页的完整数据呢?这里就无法使用on_list_page回调函数了,而需要使用field中的attached_url来请求其他分页的数据。

举个栗子:爬取某网站文章时,发现有些文章有多个内容页面,处理过程如下:

  1. $configs = array(
  2. // configs 的其他成员
  3. ...
  4. 'fields' => array(
  5. array(
  6. 'name' => "contents",
  7. 'selector' => "//div[@id='pages']//a//@href",
  8. 'repeated' => true,
  9. 'children' => array(
  10. array(
  11. // 抽取出其他分页的url待用
  12. 'name' => 'content_page_url',
  13. 'selector' => "//text()"
  14. ),
  15. array(
  16. // 抽取其他分页的内容
  17. 'name' => 'page_content',
  18. // 发送 attached_url 请求获取其他的分页数据
  19. // attached_url 使用了上面抓取的 content_page_url
  20. 'source_type' => 'attached_url',
  21. 'attached_url' => 'content_page_url',
  22. 'selector' => "//*[@id='big-pic']"
  23. ),
  24. ),
  25. ),
  26. ),
  27. );

在爬取到所有的分页数据之后,可以在on_extract_page回调函数中将这些数据组合成完整的数据

  1. $spider->on_extract_field = function($fieldname, $data, $page)
  2. {
  3. if ($fieldname == 'contents')
  4. {
  5. if (!empty($data))
  6. {
  7. $contents = $data;
  8. $data = "";
  9. foreach ($contents as $content)
  10. {
  11. $data .= $content['page_content'];
  12. }
  13. }
  14. }
  15. return $data;
  16. };