ホームページ  >  記事  >  php教程  >  PHP は最も単純なクローラー プロトタイプを実装します

PHP は最も単純なクローラー プロトタイプを実装します

WBOY
WBOYオリジナル
2016-06-14 00:01:55879ブラウズ

最も単純なクローラー モデルは次のようになります。初期 URL が与えられると、クローラーはコンテンツをプルダウンし、ページ内の URL を見つけ、これらの URL を開始点として使用してクロールを開始します。

以下は、PHP で実装された最も単純なクローラー モデルです。

  1. /**
  2. * クローラー プログラム -- プロトタイプ
  3. *
  4. * BookMoth 2009-02-21
  5. */
  6. /**
  7. * 指定された URL から HTML コンテンツを取得します
  8. *
  9. * @param string $url
  10. * @戻り文字列
  11. */
  12. 関数_getUrlContent($url){
  13. $handle = fopen($url, "r");
  14. if($handle){
  15. $content = stream_get_contents($handle,1024*1024);
  16. $content を返す;
  17. }その他{
  18. false を返す;
  19. }
  20. }
  21. /**
  22. * HTML コンテンツからリンクをフィルタリングします
  23. *
  24. * @param string $web_content
  25. * @return array
  26. */
  27. 関数_filterUrl($web_content){
  28. $reg_tag_a = '/'" ]*).*?>/';
  29. $result = preg_match_all($reg_tag_a,$web_content,$match_result);
  30. if($result){
  31. return $match_result[1];
  32. }
  33. }
  34. /**
  35. * 正しい相対パス
  36. *
  37. * @param string $base_url
  38. * @param array $url_list
  39. * @return array
  40. */
  41. function _reviseUrl($base_url,$url_list){
  42. $url_info = parse_url($base_url);
  43. $base_url = $url_info["スキーム"].'://';
  44. if($url_info["user"]&&$url_info["pass"]){
  45. $base_url .= $url_info["user"].":".$url_info["pass"]."@";
  46. }
  47. $base_url .= $url_info["ホスト"];
  48. if($url_info["ポート"]){
  49. $base_url .= ":".$url_info["port"];
  50. }
  51. $base_url .= $url_info["パス"];
  52. print_r($base_url);
  53. if(is_array($url_list)){
  54. foreach ($url_list as $url_item) {
  55. if(preg_match('/^http/',$url_item)){
  56. //已经是完全的url
  57. $result[] = $url_item;
  58. }その他 {
  59. //不完全なurl
  60. $real_url = $base_url.'/'.$url_item;
  61. $result[] = $real_url;
  62. }
  63. }
  64. $result を返す;
  65. }else {
  66. 戻る;
  67. }
  68. }
  69. /**
  70. * 爬虫
  71. *
  72. * @param string $url
  73. * @return array
  74. */
  75. 関数クローラー($url){
  76. $content = _getUrlContent($url);
  77. if($content){
  78. $url_list = _reviseUrl($url,_filterUrl($content));
  79. if($url_list){
  80. $url_list を返す;
  81. }else {
  82. 戻る;
  83. }
  84. }それ以外{
  85. 戻る;
  86. }
  87. }
  88. /**
  89. * テスト用のメインプログラム
  90. *
  91. */
  92. 関数 main(){
  93. $current_url = "http://hao123.com/";//最初のurl
  94. $fp_puts = fopen("url.txt","ab");//记录url列表
  95. $fp_gets = fopen("url.txt","r");//保存url列表
  96. してください{
  97. $result_url_arr = クローラー($current_url);
  98. if($result_url_arr){
  99. foreach ($result_url_arr as $url) {
  100. fputs($fp_puts,$url."rn");
  101. }
  102. }
  103. }while($current_url = fgets($fp_gets,1024));//不断获得url
  104. }
  105. メイン();
  106. ?>

もちろん、この爬虫類はまだ次の進化を遂げる必要があります:

1. より正確な URL リンクを貼り付けます。現在のリンクの形式が正しくない可能性があります。

2. 重複した URL リンクを削除できます。今日のクローラーは多くの反復作業を実行します。

3. 環状道路を怖がるクローラーを避ける。常に右折する車は環状 300 号線のみを走行でき、他の場所には行けません。

4. マルチスレッドまたはマルチプロセス。 PHP にはスレッドの概念がないため、それをシミュレートするにはシェルのようなものが必要になる場合があります。

5. ...漢字 2 の N 乗を省略します。

とにかく、考えてみてください~

http://blog.csdn.net/bookmoth/archive/2009/02/21/3916538.aspx より

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。