PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于web开发领域。PHP的文件后缀名为php。
本篇文章主要介绍了PHP实现小偷程序实例,实现了抓取网页咨询和商品信息的功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
“华强电子网”资讯抓取
首先,先建数据表结构,如下所示:
- 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) 即可!这样,用不了多长时间,华强电子网的资讯就会全部抓取到数据库里面了。^_^
执行界面:
数据库:
来源: http://www.phperz.com/article/17/0831/341592.html