微信号:we21cto

介绍:21CTO(21CTO.com)是中国项级技术专家的学习与服务平台.我们为CTO、技术总监、架构师等技术专家提供高质量的资讯、问答、活动等产品,同时与企业连接,提供技术咨询、研发、运维、技术支持、培训及人才招聘等服...

个性化推荐系统(三)— 构建爬虫开发函数基础库

2016-11-13 22:28 21CTO


构建网络爬虫基础库

就像我们人和人之间认识,握手相识,不同国家的人可以说着不一样的话,但只要说英语这个通用语言,大部分的人都理解。互联网之间的服务器也是一样,它们之间使用socket,http,udp等机器间的“语言”进行会话。


做为爬虫,它相当于一个小型浏览器,来模拟人来访问某个网站的链接,使用GET方法告诉对方服务器,要获取什么资源,网页还是文件。


先等一下,在深入讨论抓取网站之前,我们需要对目标网站的目录结构进行一定的了解。

Google,百度们做为公众的搜索引擎,需要遵守robots协议,也就是说被抓取的网站在根下保存一个robots.txt告诉搜索引擎的爬虫,哪些目录可以抓,哪些目录是不允许抓取的,禁止公开。比如网站后台,某些不宜公开的文件。


另外还有一个Sitemap的关键字告诉搜索引擎,网站的目录结果是啥样的。


以下是QQ的robots.txt(http://www.qq.com/robots.txt)内容:


User-agent: *

Disallow: 

Sitemap: http://www.qq.com/sitemap_index.xml


我们看到,它是完全公开的。可以让自家的搜狗,Google,百度等们全部抓取,还告诉搜索引擎自己的网站地图(Sitemap)地址,可以更全面的获取内容。


再看看淘宝的robots.txt(http://www.taobao.com/robots.txt


User-agent: Baiduspider

Allow: /article

Allow: /oshtml

Allow: /wenzhang

Disallow: /product/

Disallow: /

 

User-Agent: Googlebot

Allow: /article

Allow: /oshtml

Allow: /product

Allow: /spu

Allow: /dianpu

Allow: /wenzhang

Allow: /oversea

Disallow: /

 

User-agent: Bingbot

Allow: /article

Allow: /oshtml

Allow: /product

Allow: /spu

Allow: /dianpu

Allow: /wenzhang

Allow: /oversea

Disallow: /

 

User-Agent: 360Spider

Allow: /article

Allow: /oshtml

Allow: /wenzhang

Disallow: /

 

User-Agent: Yisouspider

Allow: /article

Allow: /oshtml

Allow: /wenzhang

Disallow: /

 

User-Agent: Sogouspider

Allow: /article

Allow: /oshtml

Allow: /product

Allow: /wenzhang

Disallow: /

 

User-Agent: Yahoo!  Slurp

Allow: /product

Allow: /spu

Allow: /dianpu

Allow: /wenzhang

Allow: /oversea

Disallow: /

 

User-Agent: *

Disallow: /

 

我们看到,淘宝网对不同的搜索引擎的待遇不太一样,但大多数允许抓取文章,对Google,Yahoo等限制规则比较少,对来路不明的爬虫,限制TA们抓取。

 

感兴趣的朋友可以多试一些网站,一些没有此文件的站点想必是不设限制抓取,比如新浪网。

 

回来说我们写的爬虫,大部分是想获取某些内容,并不是搜索引擎一样的全部抓取。如果对方网站有robots.txt,可以遵守对方设置的限制,做一个文明的蜘蛛:)

 

我们使用PHP来写爬虫程序。在PHP中可使用fopen,file,file_get_contens函数获取远端内容。格式如下:


file/fopen/file_get_contents($url)


file和fopen函数需要在php.ini中打开远端访问,file_get_contents函数则是fopen和fclose的封装。


下面是使用file_get_contents来写一个轻量爬虫函数,后面使用DOMDocment来处理HTML标签。代码如下:


<?php

function crawler($url, $id){

       $html= file_get_contents($url);

     $dom = new DOMDocument();

 

       $dom->loadHTML($html);

 

       $xPath= new DOMXPath($dom);

 

       $data= "";

       $elements= $xPath->query($id);

      

       foreach($elements as $e) {

                     $data.= $e->nodeValue;

       }  

      

       $pattern= '/,/';

       $final= preg_replace($pattern, "", $data);

      

       return$final;

}


file_get_contents函数严格说来打开本地资源比较合适,远端获取则速度稍慢些。

PHP中提供了curl库的封装,用它可以方便并高效的抓取页面。


我们来修改一下代码实现:


<?php

       functionfile_get_contents_curl($url) {

             $ch = curl_init();

                 //参数还可以再完善

             curl_setopt($ch, CURLOPT_HEADER, 0);

             curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

             curl_setopt($ch, CURLOPT_URL, $url);

             $data = curl_exec($ch);

             curl_close($ch);

             return $data;

       }

      

       functioncrawler($url, $id)

       {       

              $html= file_get_contents_curl($url);

 

            $dom= new DOMDocument();

 

            @$dom->loadHTML($html);

 

              $xPath= new DOMXPath($dom);

 

              $data= "";

              $elements= $xPath->query($id);

    

            foreach ($elements as $e)

            {

                     $data .=$e->nodeValue;

            }  

           

            $pattern = '/,/';

              $final= preg_replace($pattern, "", $data);

           

            return $final;

       }

?>

 

上面的函数库代码会更快,更健壮。


接下我们开始使用以上两个函数库来分析某个网站,包括网站使用的技术栈,分析页面链接,异常处理,摘取HTML数据,程序延时处理,携带Cookie等相关的完整实践。

 

咱们下篇接着谈,周末愉快~


 

作者:杜江。21CTO(21cto.com)社区创始人。多年架构与管理经验。 著有《PHP5与MySQL5 Web开发技术详解》、《PHP5完全攻略》、《PHP与MySQL高性能应用开发》(机械工业出版社出版,各电商平台和书店有售)。 

 

 
21CTO 更多文章 个性化推荐系统(三)— 构建爬虫开发函数基础库 个性化推荐系统架构设计(二):爬虫系统概述 个性化推荐系统架构设计(一) 程序猿怎么跳出技术的“鄙视链” 1024,程序员节节日快乐
猜您喜欢 6 月份热门前端项目推荐 假如|时光倒流我能做什么 WebApi异常处理解决方案(5)(上) JAVA-CAS简介以及ABA问题 IPv6迁移过程当中踩的坑