哈希表新爬虫系统使用手册

1,创建爬虫模板

访问Url:https://haxibiao.com/crawler/create

可创建爬虫爬虫模板

按照表单中的提示即可:

其中最后一项爬虫模板读取的模板位置是位于

config/crawlers.php的配置文件 配置内容如下示范

<?php

return [
	//懂美味
	'haodou.com' => [
		'name' => '好豆菜谱',
		'class' => '\App\Crawlers\Website\Haodou',
	],
	'meishichina.com' =>  [
		'name' => '美食天下',
		'class' => '\App\Crawlers\Website\Meishichina',	
	],
	'meishij.net'	=>	[
		'name'	=>	'美食杰',
		'class'	=>	'\App\Crawlers\Website\Meishijie',
	],
	'xiachufang.com' => [
		'name'	=>	'下厨房',
		'class'	=>	'\App\Crawlers\Website\Xiachufang',
	],
	//懂点医
	'wck.xywy.com' => [
		'name'	=>	'寻医问药',
		'class'	=>	'\App\Crawlers\Website\Xunyiwenyao',
	],
	//懂点药
	'http://ypk.39.net/jiating/' => [
		'name'	=>	'39药品通',
		'class'	=>	'\App\Crawlers\Website\Yaopintong39',
	],

    //爱你城
    'oicq88.com'                 => [
        'name'  => 'qq昵称',
        'class' => '\App\Crawlers\Website\qqname',
    ],
    //点墨阁
    'qiushibaike.com'            => [
        'name'  => '糗事百科',
        'class' => '\App\Crawlers\Website\Dianmoge\Qiushibaike',
    ],
    'haha.sogou.com'             => [
        'name'  => '搜狗哈哈',
        'class' => '\App\Crawlers\Website\Dianmoge\Sougouhaha',
    ],
    'xiaohua.zol.com.cn'         => [
        'name'  => '笑话库',
        'class' => '\App\Crawlers\Website\Dianmoge\Xiaohuaku',
    ],
    'jokeji.cn'                  => [
        'name'  => '笑话集',
        'class' => '\App\Crawlers\Website\Dianmoge\Xiaohuaji',
    ],
    'read.douban.com'            => [
        'name'  => '豆瓣阅读',
        'class' => '\App\Crawlers\Website\Dianmoge\Doubanyuedu',
    ],
    'klmahua.com'                => [
        'name'  => '快乐麻花',
        'class' => '\App\Crawlers\Website\Dianmoge\Kuailemahua',
    ],
    'laifudao.com'               => [
        'name'  => '来福岛',
        'class' => '\App\Crawlers\Website\Dianmoge\Laifudao',
    ],
    'guokr.com'                  => [
        'name'  => '果壳问答',
        'class' => '\App\Crawlers\Website\Dianmoge\Guokewenda',
    ],
    'budejie.com'                => [
        'name'  => '百思不得姐',
        'class' => '\App\Crawlers\Website\Dianmoge\Baisibudejie',
    ],

    //群衣阁
    'yoka.com' =>[
        'name'  => 'yoka时尚网',
        'class' => '\App\Crawlers\Website\Qunyige\Yoka',
    ],

];

  其中清楚的指定了站点url 以及站点名称和所用爬虫类库所在的相对路径

  当然这个针对该站点的爬虫类需要自己编写

二编写爬虫类

根据以上创建配置的路径,创建一个php未见 例如:


<?php

namespace App\Crawlers\Website\Qunyige;

use App\Crawlers\Crawlable;
use App\Crawlers\CrawlerBase;
use Symfony\Component\DomCrawler\Crawler;

class Yoka extends CrawlerBase implements Crawlable
{
    public function getList()
    {
        $urls = [];
        foreach ($this->category_config as $category_url) {
            $page     = 1;
            $page_end = true;
            while ($page_end) {
                $url           = $category_url . '&p=' . $page;
                $article_lists = @file_get_contents($url);

                if(empty($article_lists)){
                     continue;
                }
                $article_lists = mb_convert_encoding($article_lists, 'UTF-8');
                $article_lists = json_decode($article_lists);

                if ($article_lists->count == 0) {
                    break;
                }

                foreach ($article_lists->context as $article_list) {
                    echo "------------$page--get-------\n";
                    array_push($urls, $article_list->link);
                }
                $page++;

                sleep(3);
            }

            echo "-----$category_url-----";
            sleep(10);
        }

        // array_push($urls,'http://www.yoka.com/beauty/skincare/2018/0104/51683201088608.shtml');
        return $urls;
    }
    public function getDetail($url)
    {
        $contents = [];

        $contents['article'] = [
            'source_url' => $url,
            'html'       => mb_convert_encoding(file_get_contents($url),'UTF-8','gb2312'),
        ];

        return $contents;
    }
    public function parseDetail($contents)
    {
        if (empty($contents['article'])) {
            return;
        }

        $data['article']               = [];
        $data['images']                = [];
        $data['category']              = []; //文章分类信息
        $data['article']['source_url'] = $contents['article']['source_url'];
        $html                          = $contents['article']['html'];
        $crawler                       = new Crawler();
        $crawler->addHtmlContent($html);

        $is_page = $crawler->filter('.pages a');

        //filter data
        if ($is_page->count() > 0) {
            $is_page->each(function (Crawler $crawler) {
                foreach ($crawler as $node) {
                    $node->parentNode->removeChild($node);
                }
            });
        }

        $tags   = [];
        $tags[] = 'a';

        $title = $crawler->filter('.infoTitle');
        if($title->count()==0){
            return;
        }
        $data['article']['title']=$title->text();

        if(strlen($data['article']['title']) > 185){
            return;
        }

        $article_body_node        = $crawler->filter('.textCon');

        if($article_body_node->count()==0){
            echo '--------body return -------';
            return;
        }

        $data['article']['body'] =$this->stripHtmlTags($article_body_node->html());

        $data['article']['body'] =$this->filter_content($data['article']['body']);

        $article_body_image = $article_body_node->filter('img')->each(function ($node) {
            return $node->attr('src');
        });

        $image_urls=[];
        if (!empty($article_body_image)) {
            foreach ($article_body_image as $image_url) {
                // array_push($data['images'], $image_url);
                $length=strlen($image_url);
                if($length > 185){
                    continue;
                }

                $image_urls[] = ['source_url' => $image_url];
            }
        }

        $data['images'] = $image_urls;

        // dd($data);
        return $data;

    }
    public function stripHtmlTags($body)
    {
        //replace a

        $preg = "/<a.*?>(.*?)<\/a>/is";

        preg_match_all($preg, $body, $match);

        if (empty($match[0]) || empty($match[1])) {
            echo "don it need" ;
            return;
        }

        foreach ($match[0] as $index => $a_item) {
            $body = str_replace($a_item, $match[1][$index], $body);
        }

        return $body;
    }

    public function filter_content($content)
    {
        $content=str_replace("提示:YOKA时尚网独家原创稿件,未经允许请勿以任何形式转载,违者追究法律责任", "", $content);
        
        return $content;
    }

}

这是其中一个网站的爬虫类的详情代码可以看到  这个脚本文件的命名空间已经在配置文件中指定

下面分别讲解必须存在的三个函数

getLIst 函数负责获取所有要被爬取的详情页url 并把获取到的所有url,交给$urls这个数据,并返回

看以上例程,不难看出,返回的是一个带url的索引数组,具体如何实现逻辑这个要交给程序员来实现


getDetail这个函数会自动获取上个函数返回的数组递归出来的单个元素 实际上这个函数传入的参数是单个的url

我们可以在这个函数内 转码 对详情页的url发起请求并返回

需要注意的是 我以上返回是返回了一个数组把source_url也一并返回了


getParseDetail这个函数获取了getDetail函数中返回的html字符串:信息 以及source_url的信息

获取我们需要的数据(默认只支持爬取文章)存储在data这个数组里 并返回

这个需要注意的是 data['image_urls]必须是一个二维数组  如果返回的是一个一维的数组会报错.


三,运行命令

直接运行:

 $  php artisan crawler:man {你创建模板的id} {--force}

  //本地调试一定要加上--force 这个参数

这样就可以直接运行爬虫命令

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容