我试图让抓取工具从不提供任何API访问权限的网站获取模板,以便以后显示为关联企业。 我刚刚开始使用CI,阅读文档几次以下,你可以找到我的第一个OOP方法。 我的问题是,如果我在OOP的正确路径上,或者是否(我确定有)我的代码可以进行任何改进。我在网上看了很多OOP教程,人们似乎对OOP编码有不同的看法。
提前谢谢。
<?php
class Crawler extends CI_Model {
function __construct(){
parent::__construct();
}
function get_with_curl($url) {
if(!ini_get('allow_url_fopen')) {
return $this->html = file_get_html($url);
} else {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
$str = curl_exec($curl);
curl_close($curl);
return $this->html = str_get_html($str);
}
}
function array_arrange($links){
$links = array_merge(array_unique($links));
foreach (range(1, count($links), 2) as $k) {
unset($links[$k]);
}
return array_merge($links);
}
function diff($source,$links){
$this->db->like('source', $source);
$this->db->from('themes');
$total = $this->db->count_all_results();
if($total >= count($links)){
return false;
} else {
$diff = count($links)-$total;
$data = array_slice($links,-$diff,$diff,true);
return $data;
}
}
function get_links($url,$find){
$this->html = $this->get_with_curl($url);
foreach($this->html->find($find) as $v){
$data[] = $v->href;
}
$this->html->clear();
unset($this->html);
return $data;
}
function themefyme(){
$links = $this->get_links('http://themify.me/themes','ul[class=theme-list] li a');
$links = $this->array_arrange($links);
$links = $this->diff('themefyme',$links);
if($links){
$i = 0;
foreach($links as $link){
$this->html = $this->get_with_curl($link);
$data[$i]['source'] = 'themefyme';
$data[$i]['name'] = strtok($this->html->find('h1', 0)->plaintext,' ');
$data[$i]['link'] = $link;
$data[$i]['demo'] = 'http://themify.me/demo/#theme='.strtolower($data[$i]['name']);
$data[$i]['price'] = filter_var($this->html->find('h1 sup', 0)->plaintext, FILTER_SANITIZE_NUMBER_INT);
$data[$i]['description'] = $this->html->find('big', 0)->plaintext;
$data[$i]['features'] = $this->html->find('ul', 0)->plaintext;
$data[$i]['img_large'] = $this->html->find('.theme-large-screen img', 0)->src;
$data[$i]['img_thumb'] = 'http://themify.me/wp-content/themes/themify/thumb.php?src='.$data[$i]['img_large'].'&q=90&w=220';
$i++;
$this->html->clear();
unset($this->html);
}
$this->db->insert_batch('themes', $data);
return $data;
}
return false;
}
function themefuse(){
$links = $this->get_links('http://www.themefuse.com/wp-themes-shop/','.theme-img a');
$links = $this->array_arrange($links);
$links = $this->diff('themefuse',$links);
if($links){
$i = 0;
foreach($links as $link){
$this->html = $this->get_with_curl($link);
$data[$i]['source'] = 'themefuse';
$data[$i]['name'] = $this->html->find('.theme-price', 0)->plaintext;
$data[$i]['link'] = $link;
$data[$i]['demo'] = 'http://themefuse.com/demo/wp/'.strtolower($data[$i]['name']).'/';
$data[$i]['description'] = $this->html->find('.short-descr', 0)->plaintext;
$data[$i]['highlights'] = $this->html->find('.highlights', 0)->outertext;
$data[$i]['features'] = $this->html->find('.col-features', 0)->outertext;
$data[$i]['theme_info'] = $this->html->find('.col-themeinfo', 0)->outertext;
preg_match("/src=(.*?)&/",$this->html->find('.slideshow img', 0)->src, $img);
$data[$i]['img_large'] = $img[1];
$data[$i]['img_thumb'] = 'http://themefuse.com/wp-content/themes/themefuse/thumb.php?src='.$img[1].'&h=225&w=431&zc=1&q=100';
$i++;
$this->html->clear();
unset($this->html);
}
$this->db->insert_batch('themes', $data);
return $data;
}
return false;
}
}
答案 0 :(得分:2)
正如PeeHaa所说,你的例子不是真正的OOP。 OOP意味着面向对象编程,它基本上意味着您的类(对象)应该表示一个实体,就像它是一个物理对象一样。所以你的类将是一组与对象相关的函数(方法)。
例如,Robot
对象可能具有诸如moveForward,moveBackword,speak等功能。
你可能有另一种机器人类型可以完成Robot
对象可以做的所有事情,但方式略有不同。例如,您可能有一个MoonRobot
对象extends
Robot
对象(它将继承所有Robot
函数)但它的moveForward
函数可能是不同,所以这可以在MoonRobot
类中改变。