PHP 实现小偷程序
为什么使用“小偷程序”?
远程抓取文章资讯或商品信息是很多企业要求程序员实现的功能,也就是俗说的小偷程序。其最主要的优点是:解决了公司网编繁重的工作,大大提高了效率。只需要一运行就能快速的抓取别人网站的信息。
“小偷程序”在哪里运行?
“小偷程序” 应该在 Windows 下的 DOS(参考文章:http://blog.csdn.net/liruxing1715/article/details/7079488) 或 Linux 下通过 PHP 命令运行为最佳,因为,网页运行会超时。
比如图(Windows 下 DOS 为例):
“小偷程序”的实现
这里主要通过一个实例来讲解,我们来抓取下“华强电子网”的资讯信息,请先看观察这个链接 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); // 程序入口,从第一页开始抓,抓取500页
- ?>
通过上面的程序,就可以实现抓取华强电子网的资讯信息。
入口方法 init($min, $max) 如果想抓取 1-500 页面内容,那么 init(1, 500) 即可!这样,用不了多长时间,华强电子网的资讯就会全部抓取到数据库里面了。^_^
执行界面:
数据库:
PHP 实现小偷程序的更多相关文章
- php获取网页内容方法 小偷程序 采集程序
抓取到的内容在通过正则表达式做一下过滤就得到了你想要的内容,至于如何用正则表达式过滤,在这里就不做介绍了,有兴趣的,以下就是几种常用的用php抓取网页中的内容的方法.1.file_get_conten ...
- 基于PHP的cURL快速入门教程 (小偷采集程序)
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数. 最爽的是,PHP也支持 cURL 库.本文将介绍 c ...
- PHP的cURL快速入门 (小偷采集程序)
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数. 最爽的是,PHP也支持 cURL 库.本文将介绍 cUR ...
- php开发通用采集程序
php采集程序构建基本步骤: 采集程序是什么?获取远程数据(文字.图片.图片)并快速保存到本地或指定地址. 如天气预报(小偷程序): 远程获取-->替换内容-->展示给用户 如实时更新的新 ...
- 基于PHP采集数据入库程序(一)
前几天有一朋友要我帮做一个采集新闻信息的程序,抽了点时间写了个PHP版本的,随笔记录下. 说到采集,无非就是远程获取信息->提取所需内容->分类存储->读取->展示 也算是简单 ...
- 锻造完美U盘小偷:活用消息机制
锻造完美U盘小偷:活用消息机制作者:灰狐来源:灰狐's Blog 注:本文已发表在<黑客防线>2008年第1期,转载请注明出处. 以前经常看到有人做出一些蛮有意思的小工具,其中最多的似乎就 ...
- 解决file_get_contents遇到中文文件名无法打开问题
利用file_get_contents打开文件或采集远程服务器文件如果文名或url中碰到汉字中文那么会出现failed to open stream:Lnvalid argument in错误. ...
- 【转】responseText,responseBody,responseXML差别
为了做ajax的代理,研究了下服务器端的xmlhttp和客户端ajax中的xmlhttp,做了个比较 由于我一直使用JavaScript作为Asp的教本语言,所以比较起来更清楚.服务器端的xmlhtt ...
- 关于PHP的curl开启问题
今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢 ...
随机推荐
- C#面试 笔试题 五
1.什么是受管制的代码? 答:unsafe:非托管代码.不经过CLR运行. 2.net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置. ...
- KVC、KVO 理解
参考经典链接: https://www.jianshu.com/p/f8198ca5e682 https://www.jianshu.com/p/be80318115a7 一. KVC 1.KVC介绍 ...
- 369-双路千兆网络PCIe收发卡
双路千兆网络PCIe收发卡 一.产品概述 PCIe网络收发卡要求能支持千兆光口,千兆电口:半高板卡.板卡插于服务器,室温工作. 支持2路千兆光口,千兆电口. FPGA选用型号 XC7A50T-1FGG ...
- CentOS 7.4 安装python3及虚拟环境
[转]:https://www.centos.bz/2018/05/centos-7-4-%e5%ae%89%e8%a3%85python3%e5%8f%8a%e8%99%9a%e6%8b%9f%e7 ...
- hadoop集群常见问题解决
1:namenode启动 datanode未启动 解决: /hadoop/tmp/dfs/name/current VERSION 查看截取id 与 data/current VERSION集群ID ...
- Center os6.5 mysql
1 # yum -y install mysql-server mysql mysql-dev 2 启动mysql # service mysqld start 3 为root用户配置一个密码 ...
- linux firewall
一.查看防火墙状态1.首先查看防火墙是否开启,如未开启,需要先开启防火墙并作开机自启 systemctl status firewalld 开启防火墙并设置开机自启 systemctl start f ...
- 明明不太合适但是还是被用在配置文件和数据传输上的XML
XML概述: 概念: 可扩展的标记语言. 功能: 作为数据本地存储的格式.(已淘汰)作为结构化存储的方式,不如数据库效率高.目前一部分移动设备中还在使用. 作为网络中传输数据的格式.(已淘汰)作为网络 ...
- Java Web学习总结(12)Filter过滤器
一,Filter简介 Filter也称之为过滤器,Filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理. 二,Filter开发步骤 1)编写一个 ...
- 使用ajax前必须了解的知识
ajax的全称: asynchronous javascript and xml (异步的javascript和xml) ajax不是某种编程语言 是一种在无需重新加载整个页面的情况下能够更新部分网页 ...