100行PHP代码采集阿里巴巴商家信息

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.html

http://www.alibaba.com/corporations/jiangmen/CN——————————–/3.html

http://www.alibaba.com/corporations/jiangmen/CN——————————–/5.html

发现通用的列表页面链接应该是:

http://www.alibaba.com/corporations/jiangmen/CN——————————–/{$page}.html

二、             从列表页面获取所有页面内容

由于alibaba防采集,所以我们伪装成IE浏览器的HTTP访问。

<?php

$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

查看源代码,可以发现所有商家名称的链接都是此样式

<a id=”lsubject_213601299″ href=”http://rondabattery.en.alibaba.com” οnclick=”onCompanyClick(&quot;213601299&quot;);” title=”Jiangmen Ronda Battery Co., Ltd.” target=”_blank”><font><b>Jiangmen</b></font> Ronda Battery Co., Ltd.</a>

即http://{CompanyName}.en.alibaba.com

用正则从$res的内容中找出所有的{CompanyName}:

preg_match_all(‘/href\s*=\s*["|\']?([^\s"\'>]*).en.alibaba.com\”/i’,$res,$arr);

这样$arr中就是列表第一页中所有的商家的链接了。

四、             如何采集商家信息

首先循环得到单个商家的链接

<?php

foreach($arr[1] as $a=>$web)

?>

$web拼上.en.alibaba.com就是商家链接了

例如http://rondabattery.en.alibaba.com/

浏览发现 所有公司的联系信息都是http://rondabattery.en.alibaba.com/contactinfo.html

再伪装IE采集一次单个商家的联系信息页面

<?php

$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

查看源代码可以发现

<tr>

       <th width=”25%”>Company Name:</th>

       <td>       Jiangmen Ronda Battery Co., Ltd.</td>

</tr>

公司名等信息都是这样的格式

在用正则匹配就行了:

preg_match(“/Company Name:(.*?)<\/td>/s”,$res1,$Cname);

这样$Cname中就是绿色的内容

<tr>

       <th width=”25%”>Company Name:</th>

       <td>       Jiangmen Ronda Battery Co., Ltd.</td>

</tr>

显然</th><td>不是我们需要的内容

$Cname = trim(strip_tags($Cname[1]));

strip_tags:去除字符串中的html标签,

trim:去除字符串首尾的空格,

tip:

有时会碰到内容中有双引号(”),常见于公司介绍等内容,需要替换掉,否则存数据库时会出现sql语句错误。

$name = str_replace(“\“,”",$name);

六、             将获取的信息存入数据库

<?php

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个列表页面需要处理。

这样做一个带参数的页面跳转。

<?php

if($page >= 29){

       echo “OVER!”;exit();

}else{

       echo “<meta http-equiv=refresh content=’0; url=alibaba.php?page=”.++$page.”‘>”;

}

?>

然后在此php文件的开头获取需要处理的列表页号

<?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代码

<!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=utf-8″ />

<title>alibaba采集</title>

<?php

set_time_limit(0);

function _rand() {

       $length=26;

       $chars = “0123456789abcdefghijklmnopqrstuvwxyz”;

       $max = strlen($chars) – 1;

       mt_srand((double)microtime() * 1000000);

       $string = ”;

      

       for($i = 0; $i < $length; $i++) {

              $string .= $chars[mt_rand(0, $max)];

       }

       return $string;

}

error_reporting(0);

ini_set(‘html_errors’,false);

ini_set(‘display_errors’,false);

mysql_pconnect(“localhost”, “root”, “password”) or

       die (“Could not connect” . mysql_error());

mysql_select_db(“company”);

mysql_query(“SET NAMES ‘UTF8′”);

if($_GET['page']){

       $page = $_GET['page'];

}else{

       $page = ’1′;

}

$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);

preg_match_all(‘/href\s*=\s*["|\']?([^\s"\'>]*).en.alibaba.com\”/i’,$res,$arr);  

foreach($arr[1] as $a=>$web){

       $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);

       preg_match(“/contactName(.*?)<\/a>/s”,$res1,$name);

       $name = strip_tags($name[1]);

       //$name = str_replace(“\”",”",$name);

       //$name = str_replace(“>”,”",$name);

       $name = trim($name);

       preg_match(“/Company Name:(.*?)<\/td>/s”,$res1,$Cname);

       $Cname = trim(strip_tags($Cname[1]));

       preg_match(“/Street Address:(.*?)<\/td>/s”,$res1,$Add);

       $Add = trim(strip_tags($Add[1]));

       preg_match(“/City:(.*?)<\/td>/s”,$res1,$City);

       $City = trim(strip_tags($City[1]));

       preg_match(“/Province\/State:(.*?)<\/td>/s”,$res1,$Pronvice);

       $Pronvice = trim(strip_tags($Pronvice[1]));

       preg_match(“/Country\/Region:(.*?)<\/td>/s”,$res1,$Region);

       $Region = trim(strip_tags($Region[1]));

      

       preg_match(“/Zip:(.*?)<\/td>/s”,$res1,$Zip);

       $Zip = trim(strip_tags($Zip[1]));

      

       preg_match(“/Telephone:(.*?)<\/td>/s”,$res1,$Tel);

       $Tel = trim(strip_tags($Tel[1]));

      

       preg_match(“/Mobile Phone:(.*?)<\/td>/s”,$res1,$Phone);

       $Phone = trim(strip_tags($Phone[1]));

      

       preg_match(“/Fax:(.*?)<\/td>/s”,$res1,$Fax);

       $Fax = trim(strip_tags($Fax[1]));

      

       preg_match(“/Website:(.*?)<\/td>/s”,$res1,$Web);

       $Web = trim(strip_tags($Web[1]));

$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).”‘

)”);

}

if($page >= 29){

       echo “OVER!”;exit();

}else{

       echo “<meta http-equiv=refresh content=’0; url=alibaba.php?page=”.++$page.”‘>”;

}

?>

</head>

<body>

</body></html>

延伸阅读


▶ Walkthrough007

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值