是一个上传一张名片,就可以交换两张名片的网站,上面的明片信息据说有400W张以上了,登录“名片网”,可以查到世界500强等企业的管理层及员工名片。其中收录量高居榜首的是微软公司,2500多名员工的职位和联系方式赫然在列。以微软公司上海分公司为例,从前台接待到财务部经理到分公司总经理的手机号码和办公固定电话皆可一目了然,这似乎也成为“名片网”“实力”的的象征。正是有了这些珍贵的名片资源,这家“名片网”的月点击量才会高达500万以上。 但如果你没有200w张名片,又如何跟他交换哪400W张呢?哪只有交钱了,交钱也不便宜,平均一块钱看一张。本文就教你如何免费把所有名片信息都采集下来,放到自已的数据库里,用来查询或统计信息都方便。又或者自已再弄个“明骗网”出来。 采集难点: 一、免费采集:首先就要看看这个网站的规则,“上传一张名片,就可以下载两张”,就是1:2的比例获得名片了,但我可没有这么多名片,哪只有上传假的名片了,因为他们是上传了名片,马上就送积分,并不是验证真假后才给你积分,你就可以利用这个时间差,用一张假的换两张真的名片了。 二、名片ID没规律:他们的名片ID是以英文加数字的方式(/BizCard/E1C76E112031.aspx),并不是按线性数字增加的方式,并不连续的,而且还是12位长度,穷举是没可能的事了。我们只有通过搜索列表,提取ID的方式获得所有名片的ID了。 三、搜索ID:这个网站如果帐号不是VIP会员,就只能搜索到前100张名片,也就是说,我们只有成为VIP会员才行了,要成为VIP方式有两个:交188元或者试用VIP(一周,要提供手机验证),要采集几百W张名片,并不是一两小时的事,名片网的网速并不快,采集几小时后被发现封帐号是很正常的事。所以,交钱或手机验证都是不可靠的。刚好他们的手机验证部分有漏洞,验证码为4位,可以通过穷举的方式,5分钟内就可以用任意一个手机号码通过验证。 好了,现在就开始正式采集的过程了。 1、首先,我们先把他们的地区目录的地区ID值取出来,下载 到本地电脑。(get_page.php) <?php preg_replace("/CityID=(\d+?)\">(.+?)</ies", "GetArea('\\1', '\\2')", file_get_contents('http://www.mingpian.com/Search/SearchArea.aspx'));
function GetArea($place, $name) { global $area; $area[$place] = iconv("UTF-8", "GBK", $name); } ?> 上面这段代码就可以把地区ID保存到 $area 的数组里面。我们再打开 /Search/Search.aspx?CityID={$地区ID}&page=1 就可以把每个地区有多少张名片的记录取出来了。 把这里的地区,地区名字,最大页数都存进数据库里 数据库脚本: CREATE TABLE `mp` ( `place` int(10) unsigned NOT NULL auto_increment, `area` varchar(100) character set latin1 collate latin1_bin NOT NULL default '', `page` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`place`), ) ENGINE=MyISAM; 然后,我们通过以下代码,把每个地区的所有ID页面都保存到本地的电脑上面, <?php //get_page.php $result = $DB_site->query("SELECT * FROM mp"); while($row = $DB_site->fetch_array($result)){ $newpath = __SITE_ROOT . "/mingpian/cardid/$row[place]"; if(!is_dir($newpath) && !file_exists($newpath)){ mkdir($newpath, 0777); } for($i = 1; $i <= $row['pages']; $i++){ if($i > 25000) //Windows目录最多保存32768个文件,文件太多列目录时会当机,所以大于25000个文件时候,就要建新目录保存了 $filename = $newpath . "/25000/$i.html"; else $filename = $newpath . "/$i.html"; echo $filename . "\n"; if(!file_exists($filename) || filesize($filename) < 100) { $content = posttohost($row['place'], $i); //这个函数就是用 file_get_contents("/Search/Search.aspx?CityID={$place}&page={$page}"); $fp = fopen($filename, "w"); fwrite($fp, $content); fclose($fp); } } } 2、下一步,我们就是把这所有列表的ID值取出来,保存到数据库里,因为ID值太多了,数据库处理起来比较方便点,要不然的话,PHP肯定要挂了(内存不足) <?php //get_card.php $result = $DB_site->query("SELECT * FROM mp"); while($row = $DB_site->fetch_array($result)){ $newpath = __SITE_ROOT . "/mingpian/cardid/$row[place]"; if(!is_dir($newpath) && !file_exists($newpath)){ mkdir($newpath, 0777); } for($i = 1; $i <= $row['pages']; $i++){ if($i > 25000) $filename = $newpath . "/25000/$i.html"; else $filename = $newpath . "/$i.html"; echo $filename . "\n"; $content = implode("", file($filename)); preg_replace("/BizCard\/(.+?)\.aspx\"[^>]*>(.+?)<\/a>/ies", "GetCardID('\\1', '\\2', $row[place])", $content); } }
(责任编辑:admin) |