设为首页 收藏本站
查看: 1025|回复: 0

[经验分享] PHP 实现批量抓取远程页面内容(小偷程序)

[复制链接]

尚未签到

发表于 2017-4-10 11:35:06 | 显示全部楼层 |阅读模式
  为什么使用“小偷程序”?

  远程抓取文章资讯或商品信息是很多企业要求程序员实现的功能,也就是俗说的小偷程序。其最主要的优点是:解决了公司网编繁重的工作,大大提高了效率。只需要一运行就能快速的抓取别人网站的信息。
  “小偷程序”在哪里运行?
  “小偷程序” 应该在 Windows 下的 DOS(参考文章:http://blog.csdn.net/liruxing1715/article/details/7079488) 或 Linux 下通过 PHP 命令运行为最佳,因为,网页运行会超时。
  比如图(Windows 下 DOS 为例):
DSC0000.gif

  “小偷程序”的实现
  这里主要通过一个实例来讲解,我们来抓取下“华强电子网”的资讯信息,请先看观察这个链接 http://www.hqew.com/info-c10.html,当您打开这个页面的时候发现这个页面会发现一些现象:
  1、资讯列表有 500 页(2012-01-03);
  2、每页的 url 链接都有规律,比如:第1页为http://www.hqew.com/info-c10-1.html;第2页为http://www.hqew.com/info-c10-2.html;……第500页为http://www.hqew.com/info-c10-500.html;
  3、由第二点就可以知道,“华强电子网” 的资讯是伪静态或者是生成的静态页面
  其实,基本上大部分的网站都有这样的规律,比如:中关村在线、慧聪网、新浪、淘宝……。
  这样,我们可以通过这样的思路来实现页面内容的抓取:
  1、先获取文章列表页内容;
  2、根据文章列表页内容循环获取文章的 url 地址;
  3、根据文章的 url 地址获取文章的详细内容
  这里,我们主要抓取资讯页里面的:标题(title)、发布如期(date)、作者(author)、来源(source)、内容(content)
  “华强电子网”资讯抓取
  首先,先建数据表结构,如下所示:
CREATE TABLE `article`.`article` (`id` MEDIUMINT( 8 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,`title` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,`date` VARCHAR( 50 ) NOT NULL ,`author` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,`source` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,`content` TEXT NOT NULL) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
抓取程序:
<?php/*** 抓取“华强电子网”资讯程序* author Lee.* Last modify $Date: 2012-1-3 15:39:35 $*/header('Content-Type:text/html;Charset=utf-8');$mysqli = new mysqli('localhost', 'root', '1715544', 'article'); # 数据库连接,请手动修改您自己的数据库信息$mysqli->set_charset('UTF8'); # 设置数据库编码function data($url) {global $mysqli;$result = file_get_contents($url); # $result 获取 url 链接内容(注意:这里是文章列表链接)$pattern = '/<li><span class="box_r">.+<\/span><a href="([^"]+)"  title=".+" >.+<\/a><\/li>/Usi'; # 取得文章 url 的匹配正则preg_match_all($pattern, $result, $arr); # 把文章列表 url 分配给数组$arr(二维数组)foreach ($arr[1] as $val) {$val = 'http://www.hqew.com' . $val; # 真实文章 url 地址$re = file_get_contents($val); # $re 为文章 url 的内容$pa = '/<div id="article">\s+<h1>(.+)<\/h1>\s+<p id="article\_extinfo">\s+发布:\s+(.+)\s+\|\s+作者:\s+(.+)\s+\|\s+来源:\s+(.*?)\s+<span style="display:none" >.+<div id="article_body">\s*(.+)\s+<\/div>\s+<\/div><!--article end-->/Usi'; # 取得文章内容的正则preg_match_all($pa, $re, $array); # 把取到的内容分配到数组 $array$content = trim($array[5][0]); $con = array('title'=>mysqlString($array[1][0]),'date'=>mysqlString($array[2][0]), 'author'=>mysqlString(stripAuthorTag($array[3][0])),'source'=>mysqlString($array[4][0]), 'content'=>mysqlString(stripContentTag($content)));$sql = "INSERT INTO article(title,date,author,source,content) VALUES ('{$con['title']}','{$con['date']}','{$con['author']}','{$con['source']}','{$con['content']}')";$row = $mysqli->query($sql); # 添加到数据库if ($row) {echo 'add success!';} else {echo 'add failed!';}}}/*** stripOfficeTag($v) 对文章内容进行过滤,比如:去掉文章中的链接,过滤掉没有的 HTML 标签……* @param string $v* @return string*/function stripContentTag($v){$v = str_replace('<p></p>', '', $v);$v = str_replace('<p />', '', $v);$v = preg_replace('/<a href=".+" target="\_blank"><strong>(.+)<\/strong><\/a>/Usi', '\1', $v);$v = preg_replace('%(<span\s*[^>]*>(.*)</span>)%Usi', '\2', $v);$v = preg_replace('%(\s+class="Mso[^"]+")%si', '', $v);$v = preg_replace('%( style="[^"]*mso[^>]*)%si', '', $v);$v = preg_replace('/<b><\/b>/', '', $v);return $v;}/*** stripTitleTag($title) 对文章标题进行过滤* @param string $v* @return string*/function stripAuthorTag($v) {$v = preg_replace('/<a href=".+" target="\_blank">(.+)<\/a>/Usi', '\1', $v);return $v;}/*** mysqlString($str) 过滤数据* @param string $str* @return string*/function mysqlString($str) {return addslashes(trim($str));}/*** init($min, $max) 入口程序方法,从 $min 页开始取,到 $max 页结束* @param int $min 从 1 开始* @param int $max* @return string 返回 URL 地址*/function init($min=1, $max) {for ($i=$min; $i<=$max; $i++) {data("http://www.hqew.com/info-c10-{$i}.html");}}init(1, 500); #程序入口?>
  通过上面的程序,就可以实现抓取华强电子网的资讯信息。
  入口方法 init($min, $max) 如果想抓取 1-500 页面内容,那么 init(1, 500) 即可!这样,用不了多长时间,华强电子网的资讯就会全部抓取到数据库里面了。^_^
  执行界面:
DSC0001.gif

  数据库:
DSC0002.gif


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362878-1-1.html 上篇帖子: php 5.3新增的闭包语法介绍function() use() {} 下篇帖子: [原创] PHP 兼容 Curl/Socket/Stream 的 HTTP 操作类
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表