/**
*@title :猛抓点评网数据
*@Author:insun
*@blog:http://yxmhero1989.blog.163.com
*/
项目需要 抓取点评网的数据 按往常的写php大概要累死,这时候不得不佩服火车头的采集能力。
免费版的最新是7.2 虽然只能Access数据库功能 但是很强大 而且我们可以先写入access数据 然后利用db2mysql软件导成sql语句导
入到Mysql。这样折腾就达到了收费版的效果。
火车头3个步骤都要勾选 要正确做好规则和数据库安排 耐心等待 只有网址爬出来 才能内容爬出来 继续发布出来
我们来走个流程,我们需要抓取这样的这些字段
先去大众点评网看看网页规则 挖掘下
上海区规则http://www.dianping.com/shanghai
全部频道
美食 (54841) /search/category/1/10
休闲娱乐 (13371)/search/category/1/30
购物 (51060) /search/category/1/20
丽人 (14027) /search/category/1/50
结婚 (6674) /search/category/1/55
亲子 (7333) /search/category/1/70
运动健身 (3915) /search/category/1/45
酒店 (3368) /search/category/1/60
爱车 (4870) /search/category/1/65
生活服务 (22724) /search/category/1/80
美食
本帮江浙菜 (6553) g101
川菜 (2587) g102
粤菜 (1700) g103
湘菜 (1121) g104
东北菜 (682) g106
贵州菜 (85) g105
台湾菜 (339) g107
新疆/清真 (344) g108
西北菜 (119) g26481
素菜 (104) g109
火锅 (2011) g110
自助餐 (404) g111
小吃快餐 (22840) g112
日本 (1786) g113
韩国料理 (680) g114
东南亚菜 (263) g115
西餐 (2050) g116
面包甜点 (6896) g117
其他 (4994) g118
卢湾区 (193) g101r1
徐汇区 (456) g101r2
静安区 (197) g101r3
长宁区 (323) g101r4
闵行区 (616) g101r12
浦东新区 (1255) g101r5
黄浦区 (326) g101r6
普陀区 (375) g101r7
闸北区 (297) g101r8
虹口区 (331) g101r9
杨浦区 (384) g101r10
宝山区 (470) g101r13
松江区 (275) g101r5937
嘉定区 (282) g101r5938
青浦区 (231) g101r5939
近郊 (504) g101r11
发现链接类似规律如下
food美食
http://www.dianping.com/search/category/1/10/g1(*)r(*)p(*)
life娱乐
http://www.dianping.com/search/category/1/30/g1(*)r(*)p(*)
* 0-10000
其他可附加
把上面链接现在第一步的起始地址里面。
至于各个字段的规则我都写好了,可以找我要
特别是有些很烦的字段,譬如说营业时间:
<dd class="J_info-edit-wrap" data-info-type="bh">
<span class="J_brief-cont">
<span class="J_full-cont">
<span class="J_full-cont no-info" data-is-empty="1">
3个都要替换为空吧
营业时间文字很长的话 会 <p class="J_full-cont Hide"> 又是很蛋疼。
然后就是第三步的内容发布。
发布可以发布为html格式的,以前版本System目录下有个html_tpl.html例子 可以改。现在没了,不过我写个你们看看就好了。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>[标签:标题]</title> <style> body { background-color:#F1F1F1;} td {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; color: #333333;line-height:180%; } </style> </head> <body> <table cellspacing="1" cellpadding="3" border="0" bgcolor="#666666" width="780" align="center"> <tr bgcolor="#FFFFFF"> <td align="center">火车采集器HTML导出模板</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:序号]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:区域]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:分类]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:商区]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:地区]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:商户名]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:地址]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:是否是分店]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:分店名]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:关联分店]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:电话]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:营业时间brief]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:营业时间hide]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:商户描述]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:公交信息]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:人均]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:综合口味]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:综合环境]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:综合服务]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:点评总人数]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:商户官方]</td> </tr> <tr bgcolor="#FFFFFF"> <td>[标签:地图]</td> </tr> </table> </body> </html>
结果如下
保存数据库模式稍微复杂点。
我们来看免费版的保存为access发布。
由于Access很蛋疼,会出现很多错误,建议一般字段类型都设置为文本和描述类型,除了那个自增的id。另外不要出现一些关键字,出现了话建议使用[ ]括起来。
这样就不会出现下面的错误了:
========================================================================
INSERT INTO 语句的语法错误。Void ExecuteCommandTextErrorHandling(System.Data.OleDb.OleDbHResult)。===>关键字问题。
http://xianyun0216.blog.51cto.com/714887/152955
http://www.chinaret.com/user/topic_view.aspx?id=4d0e71fb-39c4-4693-8a59-4b89a5c09343
标准表达式中数据类型不匹配。Void ExecuteCommandTextErrorHandling(System.Data.OleDb.OleDbHResult)。===》之间都改为文本类型
http://blog.sina.com.cn/s/blog_4ab014680100cjq7.html
http://www.haogongju.net/art/961591
http://cnzc.cnblogs.com/archive/2004/07/09/22787.html
http://www.haogongju.net/art/961591
==========================================================================
保存的数据位access数据库 mdb格式的,07版本的话直接另存为mdb的就行了。如4.accdb ==>4.mdb 另存即可
把access数据库转换为sql语句进而导入mysql数据库,躲掉了收费的二货。
由Access版本转换为Mysql
http://zhidao.baidu.com/question/310685972.html
http://www.williamlong.info/archives/1057.html
component comdlg32.ocx or one its dependencies not correctly registered a file is missing or invalid
在windows7下注册COMDLG32.OCX
http://www.bsdlover.cn/?uid-1-action-viewspace-itemid-5893
这个db2mysql是vb编写的,win7 64bit会缺少ocx错误,winxp下不会。这个也很简单:
把 comdlg32.ocx拷贝到目录c:\Windows\SysWOW64\,然后写个bat运行
@echo off
regsvr32 c:\Windows\SysWOW64\comdlg32.ocx
这样就把access转换成了sql语句。

抓出来的数据后处理:
譬如最后一个map地图参数
我们一般是采集源码里面的poi $位置
要转换为坐标:$地图x轴,$地图y轴
地图信息
mapData: {infoHTML: '<h3>\?<\/h3><p class=\"intro\">\静\安\区\镇\宁\?\号(\愚
\园\路\口) 52397878<\/p>',src:
{closeBtn:'http://i1.dpfile.com/s/img/box_show_map_close.gif',printCSS:'http://i1.dpfile.com/s/c/c.shop.print.css'},po
i: 'IJRIERZVIVWUAT',hasEditAuth: false}
写个脚本:
<?php #echo $位置."\n"; #echo $地图x轴."\n"; #echo $地图y轴."\n"; $db_host="localhost";//服务器 $db_user="root";//用户名 $db_psw="";//密码 $db_name="dianping";//数据库名 $connection=mysql_connect($db_host,$db_user,$db_psw)or die("连接服务器失败"); mysql_select_db($db_name,$connection) or die("选择数据库失败"); mysql_query("set names'utf-8'");//utf8 set_time_limit(0);//防止超时。 $query="select * from dianping " ;// $queryresult=mysql_query($query) or die("查询数据失败");//执行查询 /* $row = mysql_fetch_array($queryresult); print_r($row['map']); */ while($row = mysql_fetch_array($queryresult)){ //print_r(decode('IJSFVSZVJARUGM')); //print_r(decode($row['map'])); $array = decode($row['map']); $string = $array['0'].",".$array['1']; echo $string."<br />"; $id = $row['id']; // $InsertQuery="insert into inspector(mid,inspector_mid) values('$model->mid','$item2') on duplicate key update inspector_mid=inspector_mid"; $UpdateQuery="update dianping set map = '$string' where id = '$id'"; $UpdateQueryResult=mysql_query($UpdateQuery) or die("查询数据失败");//执行查询 } function decode($poi) { $settings = array( 'digi'=> 16, 'add'=> 10, 'plus'=> 7, 'cha'=> 36, 'center'=> array( 'lat'=> 34.957995, 'lng'=> 107.050781, 'isDef'=> true ) ); $i = -1; $h = 0; $b = ""; $j = strlen($poi); $g = ord($poi{$j-1}); $c = substr($poi, 0, $j-1); $j--; for($e=0; $e<$j; $e++) { $d = base_convert($c{$e}, $settings['cha'], 10) - $settings['add']; if ($d>=$settings['add']) { $d = $d- $settings['plus']; } $b .= base_convert($d, 10, $settings['cha']); if ($d>$h) { $i = $e; $h = $d; } } $a = base_convert(substr($b, 0, $i), $settings['digi'], 10); $f = base_convert(substr($b, $i+1), $settings['digi'], 10); $l = ($a+$f - intval($g))/2; $k = ($f - $l)/100000; $l /= 100000; $lat = $k; $lng = $l; return array($lng, $lat); }
完事后mysql数据图:
附带一些简单的常见的火车头使用错误如下:
http://www.locoy.com/show.php?contentid=1694
该任务您没有选择采网址,采内容的任何步骤,请检查====》勾选左边三个。
火车头数据库发布模块编辑器的使用
http://www.cnblogs.com/junzhongxu/archive/2009/04/30/1446719.html
7.0对编码为GB2312的页面采集出来保存本地文件是乱码,不论设置自动识别还是指定GB2312都是乱码。是你本地文件的模块编码设置错误 。要设置成UTF-8的====》保存的时候要对应好 用utf-8的时候都用utf-8,用GB2312的时候统一使用GB2312