• 简单爬虫记录
  • 网站初期,需要快速上线,需要大量有质量的内容,需要采集。
  • 采集需要知道的知识点

    • php发起网络请求的相关的函数

      • file_get_contents
      • fscokopen
      • curl
    • 其他

      • 正则/xpath
      • 了解html
      • http相关知识
  • 下面写一个简单的php正则采集,以采集https://news.ke.com/bj/baike/0033/网站为例子
  • 推荐大家使用curl发起网络请求,function.php文件http_request方法用于发起网络请求
    <?php
    function http_request(string $url, $data = []) 
    {
        $ret = '';
        // 1、初始化
        $ch = curl_init();
        // 2、相关配置
        # 设置请求的URL地址
        curl_setopt($ch, CURLOPT_URL, $url);
        # 设置一下执行成功后不直接返回到客户端
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        # 设置超时时间  单位是秒
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        # 不进行证书的检测
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        # 伪造一个请求的浏览器型号
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3780.0 Safari/537.36');
        // 表示有请求体,是POST的提交
        if (!empty($data)) {
            # 指明是一个POST请求
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        // 3、执行
        $ret = curl_exec($ch);
        # 请求的错误码 为0表示请求正确,大于0则表求请求失败的
        if (curl_errno($ch) > 0) {
            echo curl_error($ch);
            exit;
        }
        // 4、关闭请求资源
        curl_close($ch);
        return $ret;
    }
    ?>
  • 建立01_spider.php
    <?php
    include __DIR__.'./function.php';
    $url = 'https://news.ke.com/bj/baike/0033/';
    $html = http_request($url);
    //<title>北京房产政策百科_北京房产政策知识大全【北京贝壳找房】</title>
    //i 不区分大小写 U 禁止贪婪 s 忽略换行
    $preg = '#<title>(.*)</title>#iUs';
    preg_match_all($preg, $html, $arr);
    print_r($arr);
    /**
    结果:
    $ php spider/01_spider.php
    Array
    (
        [0] => Array
            (
                [0] => <title>北京房产政策百科_北京房产政策知识大全【北京贝壳找房】</title>
            )
    
        [1] => Array
            (
                [0] => 北京房产政策百科_北京房产政策知识大全【北京贝壳找房】
            )
    
    )
    */
  • 下面写一个简单的php xpath采集.推荐使用谷歌浏览器,按以下操作获取到标题的xPath
    推荐使用谷歌浏览器,按以下操作获取到标题的xPath
  • 比如我们要匹配一个标题
    /html/body/div[3]/div[2]/div/div[2]/div[2]/div[1]/div/a

我们去掉a标签的父级div和父级的上级div以及a标签本身之后的xPath为/html/body/div[3]/div[2]/div/div[2]/div[2],
其含义为定位到了包含了整个列表的div即<div class="m-col"> </div>
因为包含整个列表的div 里面有很多a标签,我们要定位到只包含标题的a标签,发现只有标题的a标签有class="tit LOGCLICK"
所以我们这样写xpath为//*[@class="tit LOGCLICK"]/text(), 选取列表下所有带有属性为class="tit LOGCLICK"的text值。
把两个定位连起来就是完整的xPath
/html/body/div[3]/div[2]/div/div[2]/div[2]//*[@class="tit LOGCLICK"]/text()

    <?php
    
        include __DIR__.'./function.php';
        $url = 'https://news.ke.com/bj/baike/0033/';
        $html = http_request($url);
        $dom = new DOMDocument();//声明一个dom对象
        libxml_use_internal_errors(true);//忽略不严谨的html
        $dom->loadHTML($html);//加载html
        $dom->normalize();//使html规范化
        $xpath = new DOMXPath($dom);//用domXpath 加载dom 用与查询
        $query = '/html/body/div[3]/div[2]/div/div[2]/div[2]//*[@class="tit LOGCLICK"]/text()';
        $dOMNodeList = $xpath->query($query);
        foreach ($dOMNodeList as $item) {
            echo $item->nodeValue."\n";
        }

结果:

$ php spider/01_spider.php
    落户上学与商品房一致,共有产权房你能申请吗?购租并举下,北京租房能落户和上学吗?北京买房,你真的是首套吗?首套二套有啥区别?2018年北京住宅限购政策是什么?你的城市房租收入比是多少?北京公租房申请条件是怎么?怎么配租?北京积分落户初核结果可查,有异议可申请复核!买共有产权
    住房,能贷多少钱?共有产权房如何上市出售?购房资质审核时限缩短为1个工作日
    $ php spider/01_title.php
    落户上学与商品房一致,共有产权房你能申请吗?
    购租并举下,北京租房能落户和上学吗?
    北京买房,你真的是首套吗?首套二套有啥区别?
    2018年北京住宅限购政策是什么?
    你的城市房租收入比是多少?
    北京公租房申请条件是怎么?怎么配租?
    北京积分落户初核结果可查,有异议可申请复核!
    买共有产权住房,能贷多少钱?
    共有产权房如何上市出售?
    购房资质审核时限缩短为1个工作日

同理获取文章封面图

    <?php
    $query = '/html/body/div[3]/div[2]/div/div[2]/div[2]//img/@data-original';
    $dOMNodeList = $xpath->query($query);
    foreach ($dOMNodeList as $item) {
        echo $item->nodeValue."\n";
    }
    

结果:

$ php spider/01_spider.php
    http://img.ljcdn.com/neirong-image/neirong1505963217php74eT7U.jpeg.230x175.jpg
    http://img.ljcdn.com/neirong-image/neirong1503388924php4YQiIC.jpeg.230x175.jpg
    http://img.ljcdn.com/baikeimg/test1476956115php53uppX.jpeg.230x175.jpg
    http://img.ljcdn.com/baikeimg/test1476415884phpVTLtwP.jpeg.230x175.jpg
    http://img.ljcdn.com/neirong-image/neirong1503545507phpn3wzGy.jpeg.230x175.jpg
    http://img.ljcdn.com/neirong-image/neirong1535010101phpqW4fhR.jpeg.230x175.jpg
    http://img.ljcdn.com/neirong-image/neirong1533546350phpKVi1fr.jpeg.230x175.jpg
    http://img.ljcdn.com/neirong-image/neirong1532661394phpD3lSPe.jpeg.230x175.jpg
    http://img.ljcdn.com/neirong-image/neirong1531121909phpIBGplS.jpeg.230x175.jpg
    http://img.ljcdn.com/neirong-image/neirong1524223934php7p0By9.jpeg.230x175.jpg

了解更多可以查看文档

关注友儿不迷路

Last modification:September 21st, 2020 at 05:00 pm
如果觉得我的文章对你有用,请随意赞赏