您的位置:首页 > 编程语言 > PHP开发

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

2014-02-25 15:56 776 查看
——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.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” onclick=”onCompanyClick("213601299");” 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>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: