PHP實現最簡單爬蟲原型

本人qq羣也有許多的技術文檔,但願能夠爲你提供一些幫助(非技術的勿加)。

QQ羣:   281442983 (點擊連接加入羣:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235php

最簡單的爬蟲模型應該是這樣的:給一個初始url,爬蟲把內容扒下拉,找頁面裏的url,在以這些url爲起點,開始爬。html

下面是一個最簡單的php實現的爬蟲模型。web

  1. <?php
  2. /**
  3. * 爬蟲程序 -- 原型
  4. *
  5. * BookMoth 2009-02-21
  6. */
  7. /**
  8. * 從給定的url獲取html內容
  9. *
  10. * @param string $url
  11. * @return string
  12. */
  13. function _getUrlContent($url){
  14. $handle = fopen($url, "r");
  15. if($handle){
  16. $content = stream_get_contents($handle,1024*1024);
  17. return $content;
  18. }else{
  19. return false;
  20. }
  21. }
  22. /**
  23. * 從html內容中篩選連接
  24. *
  25. * @param string $web_content
  26. * @return array
  27. */
  28. function _filterUrl($web_content){
  29. $reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
  30. $result = preg_match_all($reg_tag_a,$web_content,$match_result);
  31. if($result){
  32. return $match_result[1];
  33. }
  34. }
  35. /**
  36. * 修正相對路徑
  37. *
  38. * @param string $base_url
  39. * @param array $url_list
  40. * @return array
  41. */
  42. function _reviseUrl($base_url,$url_list){
  43. $url_info = parse_url($base_url);
  44. $base_url = $url_info["scheme"].'://';
  45. if($url_info["user"]&&$url_info["pass"]){
  46. $base_url .= $url_info["user"].":".$url_info["pass"]."@";
  47. }
  48. $base_url .= $url_info["host"];
  49. if($url_info["port"]){
  50. $base_url .= ":".$url_info["port"];
  51. }
  52. $base_url .= $url_info["path"];
  53. print_r($base_url);
  54. if(is_array($url_list)){
  55. foreach ($url_list as $url_item) {
  56. if(preg_match('/^http/',$url_item)){
  57. //已是完整的url
  58. $result[] = $url_item;
  59. }else {
  60. //不完整的url
  61. $real_url = $base_url.'/'.$url_item;
  62. $result[] = $real_url;
  63. }
  64. }
  65. return $result;
  66. }else {
  67. return;
  68. }
  69. }
  70. /**
  71. * 爬蟲
  72. *
  73. * @param string $url
  74. * @return array
  75. */
  76. function crawler($url){
  77. $content = _getUrlContent($url);
  78. if($content){
  79. $url_list = _reviseUrl($url,_filterUrl($content));
  80. if($url_list){
  81. return $url_list;
  82. }else {
  83. return ;
  84. }
  85. }else{
  86. return ;
  87. }
  88. }
  89. /**
  90. * 測試用主程序
  91. *
  92. */
  93. function main(){
  94. $current_url = "http://hao123.com/";//初始url
  95. $fp_puts = fopen("url.txt","ab");//記錄url列表
  96. $fp_gets = fopen("url.txt","r");//保存url列表
  97. do{
  98. $result_url_arr = crawler($current_url);
  99. if($result_url_arr){
  100. foreach ($result_url_arr as $url) {
  101. fputs($fp_puts,$url."\r\n");
  102. }
  103. }
  104. }while ($current_url = fgets($fp_gets,1024));//不斷得到url
  105. }
  106. main();
  107. ?>

固然這隻爬蟲還須要進行下面的進化才能夠:shell

一、拼接更準確的url連接。如今的連接有多是格式錯誤的。多線程

二、可以去掉重複的url連接。如今的爬蟲會作很是多很是多的重複工做。測試

三、避免爬蟲怕成環路,一個永遠右轉的車,只能是300內環,它只會跑在三環路上,去不了別的地方。url

四、多線程或者多進程。由於php沒有線程的概念,因此可能須要shell這樣的東西來模擬了。線程

 

本人qq羣也有許多的技術文檔,但願能夠爲你提供一些幫助(非技術的勿加)。

QQ羣:   281442983 (點擊連接加入羣:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235htm

 

個人淘寶店,能夠進去逛逛噢:https://shop108912636.taobao.com/index.htm?spm=2013.1.w5001-7867000954.3.1d29318dPlLar7&scene=taobao_shop進程

相關文章
相關標籤/搜索