——authored by 李家优 Alibaba商家信息采集说明 一、如何获取商家列表页面链接 http://www.alibaba.com/corporations/jiangmen/CN——————————–.html 例如此页面为alibaba上所有jiamen商家信息列表,也能看到 Page:1/29 字样 http://www.alibaba. ——authored by 李家优 Alibaba商家信息采集说明 一、 如何获取商家列表页面链接http://www.alibaba.com/corporations/jiangmen/CN——————————–.html例如此页面为alibaba上所有jiamen商家信息列表,也能看到Page:1/29字样http://www.alibaba.com/corporations/jiangmen/CN——————————–/2.html?tracelog=24581_list_turnpage可发现末尾变成了2.html……把?以及后面的参数去掉,并修改3、4、5试试http://www.alibaba.com/corporations/jiangmen/CN——————————–/2.htmlhttp://www.alibaba.com/corporations/jiangmen/CN——————————–/3.htmlhttp://www.alibaba.com/corporations/jiangmen/CN——————————–/5.html发现通用的列表页面链接应该是:http://www.alibaba.com/corporations/jiangmen/CN——————————–/{$page}.html 二、 从列表页面获取所有页面内容由于alibaba防采集,所以我们伪装成IE浏览器的HTTP访问。$HTTP_SESSION=_rand();$HTTP_SESSION;$HTTP_URL=”http://www.alibaba.com/corporations/jiangmen/CN——————————–/”.$page.”.html”;$ch = curl_init();curl_setopt ($ch,CURLOPT_URL,$HTTP_URL);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_USERAGENT,”Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”);$res = curl_exec($ch);curl_close ($ch);?>这样列表页的内容就赋值给了$res 三、 如何从列表页面获取具体商家链接以第一页为例http://www.alibaba.com/corporations/jiangmen/CN——————————–/1.html查看源代码,可以发现所有商家名称的链接都是此样式Jiangmen Ronda Battery Co., Ltd.即http://{CompanyName}.en.alibaba.com用正则从$res的内容中找出所有的{CompanyName}:preg_match_all(‘/href\s*=\s*["|\']?([^\s"\'>]*).en.alibaba.com\”/i’,$res,$arr); 这样$arr中就是列表第一页中所有的商家的链接了。 四、 如何采集商家信息首先循环得到单个商家的链接foreach($arr[1] as $a=>$web)?>用$web拼上.en.alibaba.com就是商家链接了例如http://rondabattery.en.alibaba.com/浏览发现 所有公司的联系信息都是http://rondabattery.en.alibaba.com/contactinfo.html再伪装IE采集一次单个商家的联系信息页面$HTTP_SESSION=_rand(); $HTTP_SESSION; $HTTP_Server=$web; $HTTP_URL=”.en.alibaba.com/contactinfo.html“; $ch1 = curl_init(); curl_setopt ($ch1,CURLOPT_URL,$HTTP_Server.$HTTP_URL); curl_setopt($ch1,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch1,CURLOPT_USERAGENT,”Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”); $res1 = curl_exec($ch1); curl_close ($ch1);?>这样$res1中就是这个rondabattery公司联系信息页面的内容了。 五、 如何采集联系人、电话等详细信息http://rondabattery.en.alibaba.com/contactinfo.html查看源代码可以发现 Company Name: Jiangmen Ronda Battery Co., Ltd.公司名等信息都是这样的格式在用正则匹配就行了:preg_match(“/Company Name:(.*?)/s”,$res1,$Cname);这样$Cname中就是绿色的内容 Company Name: Jiangmen Ronda Battery Co., Ltd.显然不是我们需要的内容$Cname = trim(strip_tags($Cname[1]));trim:去除字符串首尾的空格, tip:有时会碰到内容中有双引号(”),常见于公司介绍等内容,需要替换掉,否则存数据库时会出现sql语句错误。$name = str_replace(“\““,”",$name); 六、 将获取的信息存入数据库mysql_pconnect(“localhost”, “root“, “password“) or die (“Could not connect” . mysql_error());mysql_select_db(“company“);mysql_query(“SET NAMES ‘UTF8′”); $result = mysql_query(“INSERT INTO alibaba (Name,Company,Address,City,Province,Region,Zip,Tel,Phone,Fax,Web) VALUES(‘”.htmlspecialchars($name).”‘,‘”.htmlspecialchars($Cname).”‘,‘”.htmlspecialchars($Add).”‘,‘”.htmlspecialchars($City).”‘,‘”.htmlspecialchars($Pronvice).”‘,‘”.htmlspecialchars($Region).”‘,‘”.htmlspecialchars($Zip).”‘,‘”.htmlspecialchars($Tel).”‘,‘”.htmlspecialchars($Phone).”‘,‘”.htmlspecialchars($Fax).”‘,‘”.htmlspecialchars($Web).”‘)”);?>Htmlspecialchars是将内容中的html字符做转义处理,但默认不处理双引号,所以前面有提到需要单独将双引号替换。 帐户、密码、数据库名、表名以及其中各个字段定义请根据实际情况做修改。 七、 如何处理每个列表页面前面的循环只将列表页面第一页的20个商家做了采集,但是有29个列表页面需要处理。这样做一个带参数的页面跳转。if($page >= 29){ echo “OVER!”;exit();}else{ echo “++$page.”‘>”;}?>然后在此php文件的开头获取需要处理的列表页号if($_GET['page']){ $page = $_GET['page'];}else{ $page = ’1′;}?> 这样php运行时会先获取需要处理的列表页号,如果没有传page参数则从第一页开始执行,拼出链接,即文章最开头提到的$HTTP_URL=”http://www.alibaba.com/corporations/jiangmen/CN——————————–/”.$page.”.html”; 在程序最后会判断当前处理了多少页,如果达到最大页面数就显示OVER并结束程序。否则++$page,将页号加1并做跳转继续执行此程序。 八、 php代码
09-10 22:14