爬虫抓取页面数据原理(php爬虫框架有很多 )

一、总结

1、php爬虫框架有很多,包括很多傻瓜式的软件

2、照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话$handle = fopen($url, "r");$content = stream_get_contents($handle, -1);),然后就可以获取网页上的html源代码,然后取啥数据就用正则表达式来取好了

二、爬虫抓取页面数据原理

a、网页的页面源码我们可以轻松获得

b、比如cnsd博客,文章的正文内容全部放在<article></article>当中,所以非常好获取,此时我们获取的是html的页面,不同网站标签不同,具体看情况就好

c、html的数据自带格式,所以直接放到数据库即可,因为数据库里面存的也就是html数据,要显示的话直接把这部分数据放到页面上面来即可

三、PHP爬虫最全总结1

 爬虫是我一直以来跃跃欲试的技术,现在的爬虫框架很多,比较流行的是基于python,nodejs,java,C#,PHP的的框架,其中又以基于python的爬虫流行最为广泛,还有的已经是一套傻瓜式的软件操作,如八爪鱼,火车头等软件

 今天我们首先尝试的是使用PHP实现一个爬虫程序,首先在不使用爬虫框架的基础上实践也是为了理解爬虫的原理,然后再利用PHP的lib,框架和扩展进行实践。

所有代码挂在我的github上。

1.PHP简单的爬虫–原型

爬虫的原理:

  • 给定原始的url;
  • 分析链接,根据设置的正则表达式获取链接中的内容;
  • 有的会更新原始的url再进行分析链接,获取特定内容,周而复始。
  • 将获取的内容保存在数据库中(mysql)或者本地文件中

下面是网上一个例子,我们列下来然后分析
main函数开始

<?php
/*** 爬虫程序 -- 原型** 从给定的url获取html内容* * @param string $url * @return string */
function _getUrlContent($url) {$handle = fopen($url, "r");if ($handle) {$content = stream_get_contents($handle, -1);//读取资源流到一个字符串,第二个参数需要读取的最大的字节数。默认是-1(读取全部的缓冲数据)// $content = file_get_contents($url, 1024 * 1024);return $content;} else {return false;}
}
/*** 从html内容中筛选链接* * @param string $web_content * @return array */
function _filterUrl($web_content) {$reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';$result = preg_match_all($reg_tag_a, $web_content, $match_result);if ($result) {return $match_result[1];}
}
/*** 修正相对路径* * @param string $base_url * @param array $url_list * @return array */
function _reviseUrl($base_url, $url_list) {$url_info = parse_url($base_url);//解析url$base_url = $url_info["scheme"] . '://';if ($url_info["user"] && $url_info["pass"]) {$base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";} $base_url .= $url_info["host"];if ($url_info["port"]) {$base_url .= ":" . $url_info["port"];} $base_url .= $url_info["path"];print_r($base_url);if (is_array($url_list)) {foreach ($url_list as $url_item) {if (preg_match('/^http/', $url_item)) {// 已经是完整的url$result[] = $url_item;} else {// 不完整的url$real_url = $base_url . '/' . $url_item;$result[] = $real_url;} } return $result;} else {return;}
}
/*** 爬虫* * @param string $url * @return array */
function crawler($url) {$content = _getUrlContent($url);if ($content) {$url_list = _reviseUrl($url, _filterUrl($content));if ($url_list) {return $url_list;} else {return ;} } else {return ;}
}
/*** 测试用主程序*/
function main() {$file_path = "url-01.txt";$current_url = "http://www.baidu.com/"; //初始urlif(file_exists($file_path)){unlink($file_path);}$fp_puts = fopen($file_path, "ab"); //记录url列表$fp_gets = fopen($file_path, "r"); //保存url列表do {$result_url_arr = crawler($current_url);if ($result_url_arr) {foreach ($result_url_arr as $url) {fputs($fp_puts, $url . "\r\n");} } } while ($current_url = fgets($fp_gets, 1024)); //不断获得url
}
main();
?>

2.使用crul lib

Curl是比较成熟的一个lib,异常处理、http header、POST之类都做得很好,重要的是PHP下操作MySQL进行入库操作比较省心。关于curl的说明具体可以查看PHP官方文档说明http://php.net/manual/zh/book.curl.php
不过在多线程Curl(Curl_multi)方面比较麻烦。

开启crul
针对winow系统:
- php.in中修改(注释;去掉即可)

extension=php_curl.dll

  • php文件夹下的libeay32.dll, ssleay32.dll, libssh2.dll 还有 php/ext下的php_curl4个文件移入windows/system32

使用crul爬虫的步骤:
- 使用cURL函数的基本思想是先使用curl_init()初始化一个cURL会话;
- 接着你可以通过curl_setopt()设置你需要的全部选项;
- 然后使用curl_exec()来执行会话;
- 当执行完会话后使用curl_close()关闭会话。

例子

<?php
$ch = curl_init("http://www.example.com/");
$fp = fopen("example_homepage.txt", "w");curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);curl_exec($ch);
curl_close($ch);
fclose($fp);
?>

一个完整点的例子:

<?php
/*** 将demo1-01换成curl爬虫* 爬虫程序 -- 原型* 从给定的url获取html内容* @param string $url * @return string */
function _getUrlContent($url) {$ch=curl_init();  //初始化一个cURL会话/*curl_setopt 设置一个cURL传输选项*///设置需要获取的 URL 地址curl_setopt($ch,CURLOPT_URL,$url);//TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//启用时会将头文件的信息作为数据流输出curl_setopt($ch,CURLOPT_HEADER,1);// 设置浏览器的特定headercurl_setopt($ch, CURLOPT_HTTPHEADER, array("Host: www.baidu.com","Connection: keep-alive","Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Upgrade-Insecure-Requests: 1","DNT:1","Accept-Language: zh-CN,zh;q=0.8,en-GB;q=0.6,en;q=0.4,en-US;q=0.2",/*'Cookie:_za=4540d427-eee1-435a-a533-66ecd8676d7d; */    ));$result=curl_exec($ch);//执行一个cURL会话$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);// 最后一个收到的HTTP代码if($code!='404' && $result){return $result;}curl_close($ch);//关闭cURL
}
/*** 从html内容中筛选链接* @param string $web_content * @return array */
function _filterUrl($web_content) {$reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';$result = preg_match_all($reg_tag_a, $web_content, $match_result);if ($result) {return $match_result[1];}
}
/*** 修正相对路径* @param string $base_url * @param array $url_list * @return array */
function _reviseUrl($base_url, $url_list) {$url_info = parse_url($base_url);//解析url$base_url = $url_info["scheme"] . '://';if ($url_info["user"] && $url_info["pass"]) {$base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";} $base_url .= $url_info["host"];if ($url_info["port"]) {$base_url .= ":" . $url_info["port"];} $base_url .= $url_info["path"];print_r($base_url);if (is_array($url_list)) {foreach ($url_list as $url_item) {if (preg_match('/^http/', $url_item)) {// 已经是完整的url$result[] = $url_item;} else {// 不完整的url$real_url = $base_url . '/' . $url_item;$result[] = $real_url;} } return $result;} else {return;}
}
/*** 爬虫* @param string $url * @return array */
function crawler($url) {$content = _getUrlContent($url);if ($content) {$url_list = _reviseUrl($url, _filterUrl($content));if ($url_list) {return $url_list;} else {return ;} } else {return ;}
}
/*** 测试用主程序*/
function main() {$file_path = "./url-03.txt";if(file_exists($file_path)){unlink($file_path);}$current_url = "http://www.baidu.com"; //初始url//记录url列表  ab- 追加打开一个二进制文件,并在文件末尾写数据$fp_puts = fopen($file_path, "ab"); //保存url列表 r-只读方式打开,将文件指针指向文件头$fp_gets = fopen($file_path, "r"); do {$result_url_arr = crawler($current_url);echo "<p>$current_url</p>";if ($result_url_arr) {foreach ($result_url_arr as $url) {fputs($fp_puts, $url . "\r\n");} } } while ($current_url = fgets($fp_gets, 1024)); //不断获得url
}
main();
?>

要对https支持,需要在_getUrlContent函数中加入下面的设置:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ;
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
curl_setopt($ch, CURLOPT_SSLVERSION,3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

结果疑惑:
我们通过1和2部分得到的结果差异很大,第1部分能得到四千多条url数据,而第2部分却一直是45条数据。

还有我们获得url数据可能会有重复的,这部分处理在我的github上,对应demo2-01.php,或者demo2-02.php

3.file_get_contents/stream_get_contents与curl对比

3.1 file_get_contents/stream_get_contents对比

  • stream_get_contents — 读取资源流到一个字符串
    与 [file_get_contents()]一样,但是 stream_get_contents() 是对一个已经打开的资源流进行操作,并将其内容写入一个字符串返回
$handle = fopen($url, "r");
$content = stream_get_contents($handle, -1);//读取资源流到一个字符串,第二个参数需要读取的最大的字节数。默认是-1(读取全部的缓冲数据)
  • file_get_contents — 将整个文件读入一个字符串
$content = file_get_contents($url, 1024 * 1024);

【注】 如果要打开有特殊字符的 URL (比如说有空格),就需要使用进行 URL 编码。

3.2 file_get_contents/stream_get_contents与curl对比

php中file_get_contents与curl性能比较分析一文中有详细的对比分析,主要的对比现在列下来:
- fopen /file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen /file_get_contents 好很多。

  • fopen /file_get_contents 在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。

  • fopen / file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。

  • curl 可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen / file_get_contents只能使用get方式获取数据。

4.使用框架

使用框架这一块打算以后单独研究,并拿出来单写一篇博客

所有代码挂在我的github上。

参考阅读:
- 我用爬虫一天时间“偷了”知乎一百万用户,只为证明PHP是世界上最好的语言
- 知乎 – PHP, Python, Node.js 哪个比较适合写爬虫?
- 最近关于对网络爬虫技术总结
- PHP实现简单爬虫 (http://www.oschina.net/code/snippet_258733_12343)]
- 一个PHP实现的轻量级简单爬虫
- php中file_get_contents与curl性能比较分析
- PHP curl之爬虫初步
- 开源中国-PHP爬虫框架列表
- 网页抓取:PHP实现网页爬虫方式小结,抓取爬虫
- PHP爬虫框架–PHPCrawl
- php安装pcntl扩展实现多进程

爬虫抓取页面数据原理(php爬虫框架有很多 )相关推荐

  1. java爬虫抓取网页数据论坛_Java爬虫抓取网页

    Java爬虫抓取网页原作者:hebedich  原文链接 下面直接贴代码: import java.io.BufferedReader; import java.io.InputStreamReade ...

  2. python 爬虫抓取网页数据导出excel_Python爬虫|爬取起点中文网小说信息保存到Excel...

    前言: 爬取起点中文网全部小说基本信息,小说名.作者.类别.连载\完结情况.简介,并将爬取的数据存储与EXCEL表中 环境:Python3.7 PyCharm Chrome浏览器 主要模块:xlwt ...

  3. 知乎爬虫之4:抓取页面数据

    git爬虫项目地址( 终于上传代码了~~~~关注和star在哪里):https://github.com/MatrixSeven/ZhihuSpider(已完结) 附赠之前爬取的数据一份(mysql) ...

  4. java 爬数据工具 知乎_知乎爬虫之4:抓取页面数据

    本文由博主原创,转载请注明出处:知乎爬虫之4:抓取页面数据 咱们上一篇分析了知乎的登陆请求和如何拿到粉丝/关注的请求,那么咱们这篇就来研究下如何拿利用Jsoup到咱们想要的数据. 那么咱们说下,首先请 ...

  5. 如何用python爬股票数据_python爬虫股票数据,如何用python 爬虫抓取金融数据

    Q1:如何用python 爬虫抓取金融数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为 ...

  6. 爬虫抓取网络数据时经常遇到的六种问题

    随着互联网时代的不断发展,爬虫采集已经成为了目前最为主流的数据获取方式.使用爬虫软件自动从网站中提取数据可以节省大量的时间和精力.但是,如果网站所有者发现了用户的真实IP地址,往往就会直接选择进行限制 ...

  7. python3 爬虫抓取股市数据

    python3 爬虫抓取股市数据 爬虫抓取数据的一般步骤 代码 运行结果 小结 注意事项 爬虫抓取数据的一般步骤 1.确定需要抓取的网站2.分析url,找到url的的变化规律3.分析页面的数据4.获取 ...

  8. node爬虫,抓取网页数据

    node爬虫,抓取网页数据 1.什么是爬虫? 抓取信息或者数据的程序或者是脚本 2.通过node实现对网页数据的抓取. 安装插件 request,处理请求(此包以被弃用) npm i request ...

  9. PHP利用正则表达式抓取页面数据

    PHP利用正则表达式抓取页面数据 (记录一下,00后程序员第一天写博客,2021/4/1) (抓取招头标网站中的数据) <?php header('Content-Type:text/html; ...

最新文章

  1. 白盒测试工具_别再头疼工作效率低!这些超实用的黑盒、白盒测试方法你都用上了吗?...
  2. 张一鸣批员工上班时聊游戏:老板好不好,看员工敢不敢怼他
  3. 同批号不同批次同一单据中出现数量不限制
  4. 2019 .NET China Conf之我逛魔都
  5. python3鄙视python2_Python3 正在毁灭 Python的原因分析
  6. 定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, 随机的10个字母和数字的组合;字母和数字的范围可以指定,类似(1~100)(A~z)...
  7. java中修改密码_java中用户密码加密时增加和修改的代码
  8. python 卡方分箱算法_特征工程 - 分箱
  9. 51nod-1093:骆驼和香蕉
  10. git合并分支,发布代码
  11. Conky--linux自定义桌面监控
  12. 中兴网管无法连接服务器怎么办,中兴传输网管系统问答
  13. 计算机电子电路原理图,学看电路原理图入门知识积累 - 全文
  14. 18位身份证校验代码
  15. 【01月11日】【精彩电影合集】【10部】【亲测】【Lsyq5647发布】
  16. 一套OA系统需要多少钱?
  17. java 公众号发送消息_java微信公众号发送消息模板
  18. Contrastive Search Decoding——一种对比搜索解码文本生成算法
  19. 1.Requests库
  20. TinyG 入门06

热门文章

  1. ubuntu 14.04服务器上使用nginx搭建wordpress博客详解
  2. Java --循环截取字符串
  3. 挑灯熬夜看《Build 2015 Keynote》图文笔记
  4. SQL2005学习(九),将数据库备份到网络共享文件夹中
  5. Prefactoring——Guidelines
  6. Hadoop Hive迁移至MaxCompute
  7. 【跃迁之路】【732天】程序员高效学习方法论探索系列(实验阶段489-2019.2.22)...
  8. 安全证书导入到java中的cacerts证书库
  9. PL/pgSQL学习笔记之九
  10. C语言 素数平方之和