PHP 实现网页爬虫
方法一
通过fopen和stream_get_contents获取html内容
从给定的url获取html内容
/*** 爬虫程序 -- 原型* 从给定的url获取html内容* 通过fopen和stream_get_contents获取html内容* @param string $url * @return string */function _getUrlContent($url){//fopen() 函数打开一个文件或 URL。$handle = fopen($url, "r");// var_dump($handle);die;if ($handle) {//官方是这样描述的与 stream_get_contents();file_get_contents() 一样,但是 stream_get_contents() 是对一个已经打开的资源流进行操作,并将其内容写入一个字符串返回$content = stream_get_contents($handle, 1024 * 1024);return $content;} else {return false;}}
从html内容中筛选链接。爬取信息,可直接调用
/*** 从html内容中筛选链接。爬取信息,可直接调用* @param string $web_content* @param [type] $tag [要查找的标签]* @param [type] $attr [要查找的属性名]* @param [type] $value [属性名对应的值]* @return array */function _filterUrl($web_content){$tag = 'div';$attr = '';$value = '';//自定义正则表达式$reg_tag_a = "/<$tag.*?$attr=\".*?$value.*?\".*?>(.*?)<\/$tag>/is";//获取页面所有链接的正则表达式//$reg_tag_a = "/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/";//preg_match_all 函数用于执行一个全局正则表达式匹配。//参数一:$pattern: 要搜索的模式,字符串形式。//参数二:$subject: 输入字符串。//参数三:$matches: 多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。//参数四:$flags:匹配模式,默认PREG_PATTERN_ORDER$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);// var_dump($url_info);die;$base_url = $url_info["scheme"] . '://';if (isset($url_info["user"]) && isset($url_info["pass"])) {$base_url .= $url_info["user"] . ":" . $url_info["pass"] . "@";}$base_url .= $url_info["host"];if (isset($url_info["port"])) {$base_url .= ":" . $url_info["port"];}$base_url .= $url_info["path"];// print_r($url_list);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;}}
修正链接,可不调用,直接调用_filterUrl
/*** 爬虫 其实就是修正链接,可不调用,直接调用_filterUrl* @param string $url * @return array */function crawler($url){// $url = g('url') ?? '';$content = $this->_getUrlContent($url);// var_dump($content);die;if ($content) {$url_list = $this->_reviseUrl($url, $this->_filterUrl($content));// var_dump($url_list);die;if ($url_list) {return $url_list;} else {return;}} else {return;}}
测试用主程序,往文件里写入爬虫信息
/*** 测试用主程序,往文件里写入爬虫信息*/public function main(){$current_url = "https://www.sina.com.cn/"; //初始url$fp_puts = fopen("url3.txt", "ab"); //记录url列表$fp_gets = fopen("url3.txt", "r"); //保存url列表do {$result_url_arr = $this->crawler($current_url);// var_dump($result_url_arr);die;if ($result_url_arr) {foreach ($result_url_arr as $url) {fputs($fp_puts, $url . "\r\n");}}} while ($current_url = fgets($fp_gets, 1024)); //不断获得url}
方法二
使用curl获取html页面内容
使用curl获取html页面内容
/*** [curlHtml 获取页面信息]* 使用curl获取html页面内容* @param [type] $url [网址]* @return [type] [description]*/function curlHtml($url){$curl = curl_init();curl_setopt_array($curl, array(CURLOPT_URL => "{$url}",CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => "",CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 30,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => "GET",CURLOPT_HTTPHEADER => array("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Encoding: gzip, deflate, br","Accept-Language: zh-CN,zh;q=0.9","Cache-Control: no-cache","Connection: keep-alive","Pragma: no-cache","Upgrade-Insecure-Requests: 1","User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36","cache-control: no-cache"),));curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) return false;else return $response;}
使用正则获取html内容中指定的内容
/*** [get_tag_data 使用正则获取html内容中指定的内容]* @param [type] $html [爬取的页面内容]* @param [type] $tag [要查找的标签]* @param [type] $attr [要查找的属性名]* @param [type] $value [属性名对应的值]* @return [type] [description]*/function get_tag_data($html, $tag, $attr, $value){// var_dump($tag, $attr, $value);$regex = "/<$tag.*?$attr=\".*?$value.*?\".*?>(.*?)<\/$tag>/is";// var_dump($regex);preg_match_all($regex, $html, $matches, PREG_PATTERN_ORDER);var_dump($matches);die;$data = isset($matches[1]) ? $matches[1] : '';// var_dump($data);die;return $data;}
使用xpath对获取到的html内容进行处理
/*** [get_html_data 使用xpath对获取到的html内容进行处理]* @param [type] $html [爬取的页面内容]* @param [type] $path [Xpath语句]* @param integer $tag [类型 0内容 1标签内容 自定义标签]* @param boolean $type [单个 还是多个(默认单个时输出单个)]* @return [type] [description]*/function get_html_data($html, $path, $tag = 1, $type = true){$dom = new \DOMDocument();@$dom->loadHTML("<?xml encoding='UTF-8'>" . $html); // 从一个字符串加载HTML并设置UTF8编码$dom->normalize(); // 使该HTML规范化$xpath = new \DOMXPath($dom); //用DOMXpath加载DOM,用于查询$contents = $xpath->query($path); // 获取所有内容$data = [];foreach ($contents as $value) {if ($tag == 1) {$data[] = $value->nodeValue; // 获取不带标签内容} elseif ($tag == 2) {$data[] = $dom->saveHtml($value); // 获取带标签内容} else {$data[] = $value->attributes->getNamedItem($tag)->nodeValue; // 获取attr内容}}if (count($data) == 1) {$data = $data[0];}return $data;}
测试程序,调用
//调用public function get_content(){$url = g('url') ?? '';$tag = g('tag') ?? '';$attr = g('attr') ?? '';$value = g('value') ?? '';if (empty($url) || empty($tag)) {resultInfo(4, '缺少关键参数!');}$html = $this->curlHtml($url);//使用正则获取$data = $this->get_tag_data($html, $tag, $attr, $value);//Xpath方法,暂未搞明白// $data = $this->get_html_data($html, $path, $tag = 1, $type = true);resultInfo(1, 'ok!', $data);}
PHP 实现网页爬虫相关推荐
- 【谷歌推网页爬虫新标准,开源robots.txt解析器】
https://www.toutiao.com/a1638031116246019 [谷歌推网页爬虫新标准,开源robots.txt解析器] 对于接触过网络爬虫的人来说 robots.txt 绝不陌生 ...
- python网页爬虫-python网页爬虫浅析
Python网页爬虫简介: 有时候我们需要把一个网页的图片copy 下来.通常手工的方式是鼠标右键 save picture as ... python 网页爬虫可以一次性把所有图片copy 下来. ...
- python网页爬虫-Python网页爬虫
曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离开腾讯创业后,第一个作品课程图谱也是选 ...
- Python十分适合用来开发网页爬虫
Python十分适合用来开发网页爬虫,理由如下: 1.抓取网页自身的接口 比较与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简练:比较其他动态脚本语言,如perl,sh ...
- 实战|Python轻松实现动态网页爬虫(附详细源码)
用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识. 项目背景 事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码) ...
- Python带你轻松进行网页爬虫
前不久DotNet开源大本营通过为.NET程序员演示如何在.NET下使用C#+HtmlAgilityPack+XPath进行网页数据的抓取,从而为我们展示了HtmlAgilitypack利器的优点和使 ...
- 排名前20的网页爬虫工具,超多干货
网络爬虫在许多领域都有广泛的应用,它的目标是从网站获取新的数据,并加以存储以方便访问.而网络爬虫工具越来越为人们所熟知,因为它能简化并自动化整个爬虫过程,使每个人都可以轻松访问网络数据资源. 1. O ...
- methanol 模块化的可定制的网页爬虫软件,主要的优点是速度快。
methanol模块化的可定制的网页爬虫软件,主要的优点是速度快. 下载:http://sourceforge.net/projects/methabot/?source=typ_redirect R ...
- python实现监控电脑打开网页_Python轻松实现动态网页爬虫(附详细源码)
AJAX动态加载网页 一 什么是动态网页 J哥一向注重理论与实践相结合,知其然也要知其所以然,才能以不变应万变. 所谓的动态网页,是指跟静态网页相对的一种网页编程技术.静态网页,随着html代码的生成 ...
- 您访问的网页出错了! 网络连接异常、网站服务器失去响应_数据分析系列——静态网页爬虫进阶(requests)...
在之前"数据分析系列--数据分析入门"16篇中有与爬虫的相关内容,介绍的相对简单.静态网页爬虫进阶系列将分别从网页的自动爬取(Requests).网络数据解析(BeautifulS ...
最新文章
- Android 开源框架Universal-Image-Loader全然解析(一)--- 基本介绍及使用
- 大数据在互联网金融行业中的应用
- 学习jvm,关于MAT an internal error occurred during:Parsing heap dump from问题
- ASP.NET TextBox 当鼠标点击后清空默认提示文字
- mysql cluster 数据文件_关于MYSQL CLUSTER数据文件存放节点错误问题 -问答-阿里云开发者社区-阿里云...
- 运输层--TCP协议(2)
- 每日三道前端面试题--vue 第五弹
- 微信小程序云开发教程-后端接口分析和接口返回值的格式定义
- C语言 二级指针内存模型②
- python安装包的路径
- HashMap底层原理详解
- 金融创新推动资产管理公司发展
- 最常用激活函数公式(更新中)
- 硬链接和符号链接详解
- glassfish简单介绍
- 节税指南|人才引进能节税?速教你掌握精髓!
- 大一c语言程序课程报告,大一C语言课程设计.doc
- C语言:一维数组—一个萝卜一个坑问题
- 天使跟我走,世界我都有
- 管理系统联系人之补充
热门文章
- C#调用存储过程带输出参数或返回值分类(转)
- mmdetection config文件中几个参数的理解(anchor_scales,anchor_ratios,anchor_strides)
- 墨刀和axure的区别
- 无线射频专题《协议类,IEEE 802.11/802.11b/802.11a/802.11g/802.11n/802.11ac标准简介》
- IP地址短缺该如何解决?
- H12-723题库-个人整理笔记
- 硬盘加密数据怎么恢复?BitLocker加密文件可恢复吗?BitLocker加密数据怎么恢复?
- GLSL里的矩阵对向量的乘法与OpenGL里用数组生成矩阵进行向量乘法的非直觉不一致
- 编写宠物dog类python_Python编程:创建和使用类
- 红亚2015-3月杯季赛 CTF题部分writeup