php单线程爬虫类

  • 代码:
    /**
    * @desc:单线程爬虫类
    * @author [Lee] <[<[email protected]>]>
    * @property
    * 1、callcontent 获取给定url页面中的内容的回调函数
    * 2、calltodo 处理业务逻辑的回调函数 如:把抓取到的内容处理后存到数据库
    * @method
    * run 执行爬虫程序
    *     @param depth 深度 默认2
    *     @return void
    */
    class crawl{
    public $callcontent = ‘getcontent‘;  #  获取给定url页面中的内容的回调函数
    public $calltodo = ‘todo‘;  #  处理业务逻辑的回调函数 如:把抓取到的内容处理后存到数据库
    private $url;  #  内部属性:当前处理中的url
    /*
     @desc:内部方法,调用回调函数获取页面内容
     @param url 传入到回调函数的参数
     @return ret 页面内容
     */
    private function getcontent($url){
        $callback = $this->callcontent;
        $ret = call_user_func($callback,$url);
        return $ret;
    }
    /*
     @desc:内部方法,调用回调函数进行业务处理
     @param content 传入到回调函数的参数
     */
    private function todo($content){
        $callback = $this->calltodo;
        call_user_func($callback,$content);
    }
    /*
     @desc:内部方法,获取页面中的超链接
     @param content 页面内容
     @return urls 获取到的超链接
     */
    private function geturl($content){
        $preg = ‘/<[a|A].*?href=[\‘\"]{0,1}([^>\‘\"\ ]*).*?>/‘;
        $bool = preg_match_all($preg,$content,$res);
        $urls = array();
        if($bool){
            $urls = $res[1];
        }
        $urls = array_unique($urls);
        return $urls;
    }
    /*
     @desc:内部方法,修复不完整的url
     @param url 原始url
     @param url 修复好的url
     */
    private function reviseurl($url){
        $info = parse_url($url);
        $scheme = $info["scheme"]?:‘http‘;
        $user = $info["user"];
        $pass = $info["pass"];
        $host = $info["host"];
        $port = $info["port"];
        $path = $info["path"];
        $url = $scheme . ‘://‘;
        if ($user && $pass) {
            $url .= $user . ":" . $pass . "@";
        }
        $url .= $host;
        if ($port) {
            $url .= ":" . $port;
        }
        $url .= $path;
        return $url;
    }
    /*
     @desc:构造方法,初始化url
     */
    public function __construct($url){
        $this->url = $url;
    }
    /*
     @desc:主方法,执行程序
     @param depth 挖掘深度 默认2
     */
    public function run($depth = 2){
        $url = $this->url;
        if($depth > 0){
            $depth--;
            $content = $this->getcontent($url);
            // 业务处理开始
            $this->todo($content);
            // 业务处理结束
            $urls = $this->geturl($content);
            $url = $this->reviseurl($url);
            if (is_array($urls) && !empty($urls)) {
                foreach ($urls as $u) {
                    if (preg_match(‘/^http/‘, $u)) {
                        $returl = $u;
                    } else {
                        $real = $url . ‘/‘ . $u;
                        $returl = $real;
                    }
                    $crawl = new crawl($returl);
                    $crawl->run($depth);
                }
            }
        }
    }
    }
  • 测试:
    $crawl = new crawl(‘www.baidu.com‘);
    $crawl->run();
    /*
    @desc:获取内容的回调
    */
    function getcontent($url){
    $http = new http($url);
    $ret = $http->get()->run();
    return $ret;
    }
    /*
    @desc:处理业务逻辑的回调
    */
    function todo($content){
    echo ‘执行内容‘.PHP_EOL;
    }
  • 输出:
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
    执行内容
  • 原文地址:http://blog.51cto.com/12173069/2125424

    时间: 2024-10-12 19:19:59

    php单线程爬虫类的相关文章

    单线程爬虫VS多线程爬虫的效率对比

    单线程爬虫: import re import requests import time url_EB = 'http://www.amazon.com/gp/search/other/ref=sr_sa_p_4?me=A22XNR713HGDVG&rh=n%3A9063592011%2Ck%3Aprojector&bbn=9063592011&keywords=projector&pickerToList=brandtextbin&ie=UTF8&qid=

    php多线程爬虫类

    代码: <?php /** * @desc:多线程爬虫类 * @author [Lee] <[<[email protected]>]> * @property * 1.calltrigger 触发爬虫程序的回调函数 * 2.calltodo 处理业务逻辑的回调函数 如:把抓取到的内容处理后存到数据库 * 3.timeout 超时时间,默认5秒 * 4.depth 重定向深度,默认3 * 5.name 上传文件的名字,默认file * 6.cookie 模拟登录时cookie

    4.5. scrapy两大爬虫类_Spider

    一:Spider Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取 的动作及分析某个网页(或者是有些网页)的地方. class scrapy.Spider是最基本的类,所有编写的爬虫必须继承这个类. 主要用到的函数及调用顺序为: __init__() : 初始化爬虫名字和start_urls列表 start_requests() 调用make_requests_fro

    Scrapy源码分析-常用的爬虫类-CrawlSpider(三)

    CrawlSpider classscrapy.contrib.spiders.CrawlSpider 爬取一般网站常用的spider.其定义了一些规则(rule)来提供跟进link的方便的机制. 也许该spider并不是完全适合您的特定网站或项目,但其对很多情况都使用. 因此您可以以其为起点,根据需求修改部分方法.当然您也可以实现自己的spider.除了从Spider继承过来的(您必须提供的)属性外,其提供了一个新的属性: rules: Rule对象集合.定义了提取需要跟进url的一些规则.

    python单线程爬虫code

    广度优先算法: # -*- coding: utf-8 -*- import urllib import urllib.request from bs4 import BeautifulSoup import threading mylock = threading.RLock() class Crawler: unVisitUrl = set() visitedUrl = [] def getHtml(self , url): html = '' req = urllib.request.Re

    [踩坑]python实现并行爬虫

    问题背景:指定爬虫depth.线程数, python实现并行爬虫   思路:    单线程 实现爬虫类Fetcher                 多线程 threading.Thread去调Fetcher  方法:Fetcher 中,用urllib.urlopen打开指定url,读取信息: response = urllib.urlopen(self.url) content = response.read() 但是这样有问题, 比如对于www.sina.com来说,读出来的content是

    python多线程爬虫设计及实现示例

    爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程:第二种方案是每个步骤运行一个多线程,比如N个线程进行获取,1个线程进行解析(多个线程之间切换会降低效率),N个线程进行存储. 下面我们尝试抓取http://www.chembridge.com/ 库存药品信息. 首先确定url为http://www.chembridge.com/search/se

    利用python爬取海量疾病名称百度搜索词条目数的爬虫实现

    实验原因: 目前有一个医疗百科检索项目,该项目中对关键词进行检索后,返回的结果很多,可惜结果的排序很不好,影响用户体验.简单来说,搜索出来的所有符合疾病中,有可能是最不常见的疾病是排在第一个的,而最有可能的疾病可能需要翻很多页才能找到. 实验目的: 为了优化对搜索结果的排序,想到了利用百度搜索后有显示搜索到多少词条,利用这个词条数,可以有效的对疾病排名进行一个优化.从一方面看,某一个疾病在百度的搜索词条数目越多,表示这个词条的信息特别丰富,侧面反映了搜索这个词条的人特别多,从而可以推出这个疾病在

    Python3 爬虫(八) -- BeautifulSoup之再次爬取CSDN博文

    序 我的Python3爬虫(五)博文使用utllib基本函数以及正则表达式技术实现了爬取csdn全部博文信息的任务. 链接:Python3 爬虫(五) -- 单线程爬取我的CSDN全部博文 上一篇,我们学习了BeautifulSoup这样一个优秀的Python库,必须有效利用起来.那么我们就利用BeautifulSoup4重新实现一次爬取csdn博文的任务. 由于我修改了博客配置,首页主题换了一下,我们基于新的主题查看网页,如下图所示: 同样的,确认要提取的信息,以及博文总页数. 分析网页源码