方法一

通过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 实现网页爬虫相关推荐

  1. 【谷歌推网页爬虫新标准,开源robots.txt解析器】

    https://www.toutiao.com/a1638031116246019 [谷歌推网页爬虫新标准,开源robots.txt解析器] 对于接触过网络爬虫的人来说 robots.txt 绝不陌生 ...

  2. python网页爬虫-python网页爬虫浅析

    Python网页爬虫简介: 有时候我们需要把一个网页的图片copy 下来.通常手工的方式是鼠标右键 save picture as ... python 网页爬虫可以一次性把所有图片copy 下来. ...

  3. python网页爬虫-Python网页爬虫

    曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离开腾讯创业后,第一个作品课程图谱也是选 ...

  4. Python十分适合用来开发网页爬虫

    Python十分适合用来开发网页爬虫,理由如下: 1.抓取网页自身的接口 比较与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简练:比较其他动态脚本语言,如perl,sh ...

  5. 实战|Python轻松实现动态网页爬虫(附详细源码)

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识. 项目背景 事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码) ...

  6. Python带你轻松进行网页爬虫

    前不久DotNet开源大本营通过为.NET程序员演示如何在.NET下使用C#+HtmlAgilityPack+XPath进行网页数据的抓取,从而为我们展示了HtmlAgilitypack利器的优点和使 ...

  7. 排名前20的网页爬虫工具,超多干货

    网络爬虫在许多领域都有广泛的应用,它的目标是从网站获取新的数据,并加以存储以方便访问.而网络爬虫工具越来越为人们所熟知,因为它能简化并自动化整个爬虫过程,使每个人都可以轻松访问网络数据资源. 1. O ...

  8. methanol 模块化的可定制的网页爬虫软件,主要的优点是速度快。

    methanol模块化的可定制的网页爬虫软件,主要的优点是速度快. 下载:http://sourceforge.net/projects/methabot/?source=typ_redirect R ...

  9. python实现监控电脑打开网页_Python轻松实现动态网页爬虫(附详细源码)

    AJAX动态加载网页 一 什么是动态网页 J哥一向注重理论与实践相结合,知其然也要知其所以然,才能以不变应万变. 所谓的动态网页,是指跟静态网页相对的一种网页编程技术.静态网页,随着html代码的生成 ...

  10. 您访问的网页出错了! 网络连接异常、网站服务器失去响应_数据分析系列——静态网页爬虫进阶(requests)...

    在之前"数据分析系列--数据分析入门"16篇中有与爬虫的相关内容,介绍的相对简单.静态网页爬虫进阶系列将分别从网页的自动爬取(Requests).网络数据解析(BeautifulS ...

最新文章

  1. Android 开源框架Universal-Image-Loader全然解析(一)--- 基本介绍及使用
  2. 大数据在互联网金融行业中的应用
  3. 学习jvm,关于MAT an internal error occurred during:Parsing heap dump from问题
  4. ASP.NET TextBox 当鼠标点击后清空默认提示文字
  5. mysql cluster 数据文件_关于MYSQL CLUSTER数据文件存放节点错误问题 -问答-阿里云开发者社区-阿里云...
  6. 运输层--TCP协议(2)
  7. 每日三道前端面试题--vue 第五弹
  8. 微信小程序云开发教程-后端接口分析和接口返回值的格式定义
  9. C语言 二级指针内存模型②
  10. python安装包的路径
  11. HashMap底层原理详解
  12. 金融创新推动资产管理公司发展
  13. 最常用激活函数公式(更新中)
  14. 硬链接和符号链接详解
  15. glassfish简单介绍
  16. 节税指南|人才引进能节税?速教你掌握精髓!
  17. 大一c语言程序课程报告,大一C语言课程设计.doc
  18. C语言:一维数组—一个萝卜一个坑问题
  19. 天使跟我走,世界我都有
  20. 管理系统联系人之补充

热门文章

  1. C#调用存储过程带输出参数或返回值分类(转)
  2. mmdetection config文件中几个参数的理解(anchor_scales,anchor_ratios,anchor_strides)
  3. 墨刀和axure的区别
  4. 无线射频专题《协议类,IEEE 802.11/802.11b/802.11a/802.11g/802.11n/802.11ac标准简介》
  5. IP地址短缺该如何解决?
  6. H12-723题库-个人整理笔记
  7. 硬盘加密数据怎么恢复?BitLocker加密文件可恢复吗?BitLocker加密数据怎么恢复?
  8. GLSL里的矩阵对向量的乘法与OpenGL里用数组生成矩阵进行向量乘法的非直觉不一致
  9. 编写宠物dog类python_Python编程:创建和使用类
  10. 红亚2015-3月杯季赛 CTF题部分writeup