小説のコレクションコードを共有します。
最近、小説を集めるために機関車とETを使用しましたが、ルールに従ってそれらが一致しないことがよくありました。小説 520 のような iframe に遭遇したとき、私は自分で iframe を作成しなければなりませんでした。最初は、たった 2 つのルールで [リスト、コンテンツ] を解決するのは複雑だと思いました。
数回修正した後、コードをどのようにカプセル化するかという最大の問題に遭遇しました。つまり、異なるサイトを使用する場合に変更のコストが少なくなります。ここでは意思決定者モデルが使用されます。次に、カプセル化された関数を作成します。そして再収集する場合、再収集を避けるために収集済みの章をスキップする仕組みがあります[結局のところ、小説サイトにはいくつかのw記事があり、一度中断されて続行できなくなると非常に憂鬱です]
PHP コード
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
class grep extends コントローラー {
var $tableName = 'grep';
var $pagesize =31;
var $order_string = "grep_order 記述,grep_id 記述";
var $filter_field = "grep_title";
var $check_repeat_field = "grep_title";
var $buttons = 配列(
);
var $description = "[反復取小说]";
関数インデックス()
{
// ストーリーリストを取得する
$story_model = "ストーリーモデル";
$this->load->model($story_model);
$where = array("story_id $story_model->get($where);
foreach ($rows_story として $key=>$val_story):
if($key storycate_vtitle."/".$val_story->story_vtitle;
$src_content = file_get_contents($url);
$src_content = iconv("GBK","utf-8//IGNORE",$src_content);
$src_content = str_replace("/style="border-width:0pxs*1pxs*1pxs*0px;border-color:#C8D8B8;border-style:solid;padding:3px;float:left;width:313px;"/i ","",$src_content);
$src_content = str_replace("style="BORDER-RIGHT: #c8d8b8 1px ソリッド; PADDING-RIGHT: 3px; BORDER-TOP: #c8d8b8 0px ソリッド; PADDING-LEFT: 3px; FLOAT: left; PADDING-BOTTOM: 3px; BORDER -LEFT: #c8d8b8 0px ソリッド; 幅: 313px; ボーダー-ボトム: #c8d8b8 1px ソリッド"","",$src_content);
$src_content = preg_replace("/title="[^"]*"/iU","",$src_content);
$src_content = preg_replace("/title="[^"]*"/iU","",$src_content);
$src_content = preg_replace("/
ログイン後にコピー
]*>/iU","",$src_content);
$src_content = preg_replace("/[^>gt;]*>/iU","",$src_content);
$src_content = preg_replace("/
/iU",$src_content,$arr_dstorycate);
$dstorycate_arr = $arr_dstorycate[1];
foreach ($dstorycate_arr as $key_dstorycate => $val_dstory_cate)
{
preg_match_all("/([^<]*)/i",$val_dstory_cate,$dcate_title);
$datacate["dstorycate_pid"] = $val_story->story_id;
$datacate["dstorycate_title"] = $dcate_title[1][0];
//获取类对オブジェクト,记将之前の类别标位置记ダウンロード
$dtitle =$datacate["dstorycate_title"];
$obj_storycate = $this->check_dcate($dtitle,$val_story );
//pr($obj_storycate);
if($obj_storycate->dstorycate_ishot == 1)
{
$this->log( "此章节已抓取完 $val_story->story_title - $dtitle ,跳过");
続く;
}
preg_match_all("/]*>(?!)([dD]*)/iU" ,$val_dstory_cate,$dinfo_list);
$list_story_url = $dinfo_list[1];
$list_story_title = $dinfo_list[2];
$story_url = "http://www.xiaoxiaoshuo.net/".$val_story->storycate_vtitle."/".$val_story->story_vtitle;
$this->add_storyxxs_info($obj_storycate,$list_story_url,$list_story_title,$story_url);
}
エンドフォーリーチ;
}関数ステータス()
{
$sql = "dstory の all_story として count(dstory_id) を選択;";
$query = $this->db->query($sql);
$cont_all = $query->row();
echo $cont_all->all_story;
$sql = "dstory_status = 1 の dstory から count(dstory_id) を story1 として選択します";
$query = $this->db->query($sql);
$cont_all = $query->row();
echo "--".$cont_all->story1;
$sql = "dstorycate から max_id として max(dstorycate_id)、max_pid として max(dstorycate_pid) を選択";
$query = $this->db->query($sql);
$cont_all = $query->row();
echo "--".$cont_all->max_id."--".$cont_all->max_pid;
}
/*** *445 以降の章をダウンロードしてください
**/
関数インデックス445()
{
$story_model = "ストーリーモデル";
$this->load->model($story_model);
$where = array("story_id > 445");
$rows_story = $this->$story_model->get($where);
foreach ($rows_story として $key=>$val_story):
//story_contentを取得します
$story_url_arr =explode("/",$val_story->story_url);
$story_url= $story_url_arr[1]."/".$story_url_arr[2]."/".$story_url_arr[3]."/".$story_url_arr[4];
$dest_url = "http://www.xiaoshuo520.com/".$story_url;
$src_content = CS_file_get_contents($dest_url);
$src_content = iconv("GBK","utf-8//IGNORE",$src_content);
//按类别行分类分组データ。
preg_match_all("/(
[dD]*) $val_dstory_cate)
{
preg_match_all("/([dD]*) /i",$val_dstory_cate,$dcate_title);
$datacate["dstorycate_pid"] = $val_story->story_id;
$datacate["dstorycate_title"] = $dcate_title[1][0];
//获取类对オブジェクト,记将之前の类别标位置记ダウンロード
$dtitle =$datacate["dstorycate_title"];
$obj_storycate = $this->check_dcate($dtitle,$val_story );
//pr($obj_storycate);
if($obj_storycate->dstorycate_ishot == 1)
{
$this->log( "
此章节已抓取完 $val_story->story_title - $dtitle ,跳过");
続く;
}
preg_match_all("/
]*>(?!)([dD]*)/iU" ,$val_dstory_cate,$dinfo_list);
$list_story_url = $dinfo_list[1];
$list_story_title = $dinfo_list[2];
$this->add_story520_info($obj_storycate,$list_story_url,$list_story_title,$story_url);
}
エンドフォーリーチ;
}
/*** 章標準と新規オブジェクトに基づいてタイトルオブジェクトを取得します
**/
関数 check_dcat($title,$obj_story)
{
$dstorycate_model = "dstorycate_model";
$this->load->model($dstorycate_model);
$where = array("dstorycate_pid = $obj_story->story_id","dstorycate_title = '$title'");
$rows = $this->$dstorycate_model->get($where);
if(!$rows)
{
$datacate["dstorycate_pid"] = $obj_story->story_id;
$datacate["dstorycate_title"] = $title;
$this->$dstorycate_model->insert($datacate);
$obj_cate_id = $this->db->insert_id();
$where = array("dstorycate_id = $obj_cate_id","dstorycate_title = '$title'");
$rows = $this->$dstorycate_model->get($where);
$this->log( "此书没有相关类别,将进追加小说$obj_story->story_title - $title ");
}それ以外 {
$this->log( "已存在相关小说类别 $obj_story->story_title - $title ,跳过");
}
$obj_cate = $rows[0];
$sql = "dstorycate を更新 set dstorycate_published = 1 where dstorycate_pid = $obj_story->story_id && dstorycate_id < $obj_cate->dstorycate_id ";
$this->db->query($sql);
$obj_cate を返します。
}
/***
*小説の章を追加*/
function add_story520_info($cate_obj,$list_story_url,$list_story_title,$url)
{
$dstory_model = "dstory_model";
$this->load->model($dstory_model);
$min_key = intval($cate_obj->dstorycate_pvcount);
if(!$min_key) $min_key = 0 ;
foreach($list_story_url as $key=>$val):
if($key check_dstory($cate_obj,"http://www.xiaoshuo520.com/".$url."/".$val,$list_story_title[$key],"grep_520_info");
エンドフォーリーチ;
}
function add_storyxxs_info($cate_obj,$list_story_url,$list_story_title,$url)
{
$dstory_model = "dstory_model";
$this->load->model($dstory_model);
$min_key = intval($cate_obj->dstorycate_pvcount);
if(!$min_key) $min_key = 0 ;
foreach($list_story_url as $key=>$val):
if($key log("$cate_obj->dstorycate_id 号 $cate_obj->dstorycate_title ".$list_story_title[$key]." 章 $key check_dstory($cate_obj,$url."/".$val,$list_story_title[$key],"grep_xxs_info");
エンドフォーリーチ;
}