<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. php語言

    PHP可以靈活配置使用的采集器

    時間:2025-01-07 03:37:40 php語言 我要投稿
    • 相關推薦

    PHP可以靈活配置使用的采集器

      PHP可以靈活配置使用的采集器?就跟隨百分網小編一起去了解下吧,想了解更多相關信息請持續關注我們應屆畢業生考試網!

      代碼:

      <?php

      /**

      *  可以靈活配置使用的采集器

      *  作者:Rain

      *  創建時間:2015-02-03 15:17:30

      *  版本信息:V1.0

      */

      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      //數據庫的相關配置信息,請根據您的數據庫信息進行配置

      define('DB_HOST', 'localhost');

      define('DB_USER', 'root');

      define('DB_PWD', 'test123456');

      define('DB_NAME', 'test_dbname');

      define('DB_CHARSET', 'utf8');

      define('TABLE_NAME', 'tb_book');

      //end

      //網站信息相關的配置,請根據具體需要采集的網站內容信息進行配置

      define('WEB_CHARSET', 'gbk');

      //變動的參數,使用%d進行替換,只支持數值形式的變動

      define('WEB_LIST_URL', 'http://www.pcbookcn.com/book/1_%d.htm');

      //分頁的條數

      define('PAGE_COUNT', 14);

      //從哪個頁面開始抓取

      define('PAGE_START', 1);

      //內容頁的URL,使用正則模式,必須包含/,例如:/\/xuefu2008\/article\/details\/(\d)+/i

      define('WEB_CONTENT_URL_REG', '/\/book\/(\d)+\.htm/i');

      //網站域名HOST信息,不包含末尾的/,例如:http://blog.csdn.net

      define('WEB_HOST', 'http://www.pcbookcn.com');

      //列表頁內容的精準定位,用來大致抓取一個列表頁的內容顯示模塊位置,使用正則進行定位

      define('WEB_LIST_POSTION', '/book_name\.gif(.*?)<td\swidth="15\%"\snowrap>/i');

      //end

      //微調參數,通常不修改也不會影響您的正常使用

      define('SLEEP_TIME', 1);

      define('IS_DEBUG', false);

      define('INSERT_DB', true);

      //內容的輸出速度,單位:秒

      define('OUTPUT_SPEED', 1);

      //end

      //需要過濾刪除的文字,根據采集的網站類型進行設置,不區分大小寫

      $text_filter = array(

      '- 中華電腦書庫' => '',

      '_電腦電子書' => '',

      '_電腦書籍' => '',

      '下載' => '',

      );

      //表結構映射的配置

      $table_mapping = array(

      //表字段名稱 => 獲取該字段的正則表達式,非空字段都必須在此設置映射關系,常量值請直接填寫具體對應的值,無需使用正則

      'size' => '/軟件大小.*?000000>(.*?)<\/font>/i',

      'logo' => 'http://www.94cto.com/index/uploads/images/20150105/0b8461910de101cc51a07684cdab797e.jpg',

      'field1' => '/<title>(.*?)<\/title>/i',

      'field2' => '/軟件簡介.*?000000>(.*?)<\/font>/i',

      'field3' => '1',

      'field4' => '1',

      'field5' => '1',

      'field6' => '電子書,計算機,圖像,圖形',

      'platform' => 'window/Linux',

      'ishot' => '1',

      'agreement' => '免費',

      'downurl' => '/(\/down\.asp\?id=.*?)"/i',

      'istop' => '1',

      );

      ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

      $ga = new Gather();

      $ga->run();

      class Gather

      {

      public function __construct()

      {

      $this->init_check();

      }

      public function run()

      {

      global $table_mapping, $text_filter;

      for ($page = PAGE_START; $page <= PAGE_COUNT; $page++)

      {

      $this->write('開始采集列表第'.$page.'頁的內容...');

      $list_content = $this->get(sprintf(WEB_LIST_URL, $page));

      if (empty($list_content))

      {

      $this->write('抓取的列表頁的內容為空,所以過濾掉');

      continue;

      }

      $list_content = str_replace("\r", '', $list_content);

      $list_content = str_replace("\n", '', $list_content);

      //精準定位要抓取的模塊內容

      if (!preg_match(WEB_LIST_POSTION, $list_content, $list_search))

      {

      $this->write('精準匹配列表頁的內容失敗,所以過濾掉');

      continue;

      }

      if (isset($list_search[1]))

      $list_content = $list_search[1];

      else

      $list_content = $list_search[0];

      //end

      preg_match_all(WEB_CONTENT_URL_REG, $list_content, $match);

      if (is_array($match[0]) && !empty($match[0]))

      {

      $this->write('當前的列表頁面,總共匹配到:'.count($match[0]).'個內容頁');

      foreach ($match[0] as $val)

      {

      if (strpos($val, 'http:') === false)

      {

      if (substr($val, 0, 1) == '/')

      $val = WEB_HOST.$val;

      else

      $val = WEB_HOST.'/'.$val;

      }

      $web_content = $this->get($val);

      if (empty($web_content))

      {

      $this->write('抓取的內容頁為空,所以過濾掉');

      continue;

      }

      $web_content = str_replace("\r", '', $web_content);

      $web_content = str_replace("\n", '【】', $web_content);

      $sql = "INSERT INTO ".TABLE_NAME."(".implode(', ', array_keys($table_mapping)).")VALUES(";

      foreach ($table_mapping as $field => $reg)

      $sql .= ':'.$field.',';

      $sql = substr($sql ,0, -1);

      $sql .= ')';

      if (IS_DEBUG)

      $this->write('執行SQL '.$sql);

      $dsn = 'mysql:dbname='.DB_NAME.';host='.DB_HOST;

      try {

      $dbh = new PDO($dsn, DB_USER, DB_PWD);

      } catch (PDOException $e) {

      $this->write( 'Connection failed: ' . $e->getMessage(), true);

      }

      $dbh->query("set names 'utf8'");

      $sth = $dbh->prepare($sql);

      foreach ($table_mapping as $field => $reg)

      {

      if (substr($reg, 0, 1) !=  '/')

      {

      $$field = $reg;

      }

      else

      {

      if (!preg_match($reg, $web_content, $tmp_match))

      {

      $this->write('對不起,匹配字段:'.$field.'失敗,過濾此記錄');

      continue 2;

      }

      $$field = $tmp_match[1];

      $$field = $this->closetags($$field);

      //刪除javascript腳本

      $$field = preg_replace('/<script(.*?)>(.*?)<\/script>/i', '', $$field);

      //將鏈接刪除

      $$field = preg_replace('/<a(.*?)>(.*?)<\/a>/i', '${2}', $$field);

      //圖片鏈接地址絕對地址化

      preg_match_all('/<img.*?src=("|\')+(.*?)("|\')+.*?>/i', $$field, $img_match);

      if (isset($img_match[2]) && is_array($img_match[2]) && !empty($img_match[2]))

      {

      foreach ($img_match[2] as $img_val)

      {

      if (strpos($img_val, 'http:') === false)

      {

      $new_val = $img_val;

      if (substr($new_val, 0, 1) != '/')

      $new_val = '/'.$img_val;

      $new_val = WEB_HOST.$new_val;

      $$field = str_replace($img_val, $new_val, $$field);

      }

      }

      }

      //end

      //針對HTML里面的pre的換行先做一個特殊處理

      $$field = preg_replace('/<pre.*?>(.*?)<\/pre>/i', '<pre class="prettyprint">${1}</pre>', $$field);

      preg_match_all('/<pre>(.*?)<\/pre>/i', $$field, $pre_match);

      if (isset($pre_match[1]) && is_array($pre_match[1]) && !empty($pre_match[1]))

      {

      foreach ($pre_match[1] as $pre_val)

      $$field = str_replace($pre_val, str_replace("【】", "\r\n", $pre_val), $$field);

      }

      //end

      }

      //入庫之前,將對應的換行符號都還原回來

      $$field = str_replace('【】', "\r\n", $$field);

      //文本的過濾和替換操作

      if (is_array($text_filter) && !empty($text_filter))

      {

      foreach ($text_filter as $tk => $tv)

      $$field = str_ireplace($tk, $tv, $$field);

      }

      if (IS_DEBUG)

      $this->write('*'."\t".'字段:'.$field.'  值:'."\n****************************************************\n".$$field."\n****************************************************");

      if ('downurl' == $field && stripos($$field, 'http:') === false)

      if (substr($$field, 0, 1) == '/')

      $$field = WEB_HOST.trim($$field);

      else

      $$field = WEB_HOST.'/'.trim($$field);

      $sth->bindValue(':'.$field, trim($$field));

      }

      if (INSERT_DB)

      $sth->execute();

      $sth->closeCursor();

      $this->write( '休息,暫停'.SLEEP_TIME.'秒后繼續抓取...');

      sleep(SLEEP_TIME);

      }

      }

      else

      {

      $this->write('列表頁面沒有抓取到內容,所以過濾掉');

      }

      }

      $this->write('', true);

      }

      protected function closetags($html)

      {

      // 不需要補全的標簽

      $arr_single_tags = array('meta', 'img', 'br', 'link', 'area');

      // 匹配開始標簽

      preg_match_all('#<([a-z]+)(?: .*)?(?<![/|/ ])>#iU', $html, $result);

      $openedtags = $result[1];

      // 匹配關閉標簽

      preg_match_all('#</([a-z]+)>#iU', $html, $result);

      $closedtags = $result[1];

      // 計算關閉開啟標簽數量,如果相同就返回html數據

      $len_opened = count($openedtags);

      if (count($closedtags) == $len_opened) {

      return $html;

      }

      // 把排序數組,將最后一個開啟的標簽放在最前面

      $openedtags = array_reverse($openedtags);

      // 遍歷開啟標簽數組

      for ($i = 0; $i < $len_opened; $i++) {

      // 如果需要補全的標簽

      if (!in_array($openedtags[$i], $arr_single_tags)) {

      // 如果這個標簽不在關閉的標簽中

      if (!in_array($openedtags[$i], $closedtags)) {

      // 直接補全閉合標簽

      $html .= '</' . $openedtags[$i] . '>';

      } else {

      unset($closedtags[array_search($openedtags[$i], $closedtags)]);

      }

      }

      }

      return $html;

      }

      protected function init_check()

      {

      if (!$this->check_curl_support())

      $this->write('對不起,請先開啟CURL的類庫的支持,否則無法執行', true);

      $this->check_mysql_connect();

      $this->write('程序初始化檢查通過,執行后續的流程...');

      }

      private function get($url, $data = array())

      {

      $this->write('開始執行抓取: '.$url);

      $ch = curl_init();

      curl_setopt($ch, CURLOPT_URL, $url);

      //curl_setopt($ch, CURLOPT_USERAGENT, "Baiduspider+(+http://www.baidu.com/search/spider.htm)");

      curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");

      curl_setopt($ch, CURLOPT_HEADER, 0);

      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

      curl_setopt($ch, CURLOPT_HTTPHEADER, $data);

      $ret = curl_exec($ch);

      $error = curl_error($ch);

      curl_close($ch);

      unset($ch);

      if (!empty($error))

      {

      $this->write('程序抓取URL: '.$url.'發生錯誤,錯誤信息: '.$error);

      return false;

      }

      if (WEB_CHARSET != 'utf-8')

      $ret = iconv(WEB_CHARSET, 'utf-8', $ret);

      return $ret;

      }

      //when check finish,mysql connect will auto close

      private function check_mysql_connect()

    【PHP可以靈活配置使用的采集器】相關文章:

    php學習之php配置07-15

    PHP基礎配置09-25

    PHP安裝與配置09-09

    PHP socket的配置及實例10-16

    如何配置php環境07-16

    php環境怎么配置09-24

    編譯php的配置參數實10-25

    如何配置PHP開發環境07-21

    PHP配置文件詳解php.ini10-19

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人