欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

抓取“维库电子市场”供应商程序

程序员文章站 2024-04-06 14:39:49
...
/**
* 抓取“维库电子市场”供应商主程序
* author Lee.
* Last modify $Date: 2012-2-3 9:30:21 $
* 注:本程序按照编码 GB2312 执行,因为“维库电子市场”网站是GB2312编码,数据库也得保持一致
*/
class weiku {
private $key; // 型号
private $pageNum; // 页码

/**
* 入口程序
*/
public function go($key) {
$this->key = $key;
$this->pageNum = $this->getPageNum();
$this->getInfo();
}

/**
* 获取供应商 url 链接数组
* @return ArrayObject
*/
private function getInfo() {
if ($this->pageNum==1) { # 处理只有一页的情况
$arr = $this->shopAddContact($this->shopUrlMatchReArr($this->getContent()));
$this->isAddSuccess($arr);
} elseif ($this->pageNum>1) { # 多页
for ($i=1; $ipageNum; $i++) {
$arr = $this->shopAddContact($this->shopUrlMatchReArr($this->getContent($i)));
$this->isAddSuccess($arr);
}
}
}

/**
* 打印是否添加成功
* @param ArrayObject $arr
* @return string
*/
private function isAddSuccess($arr) {
foreach ($arr as $k=>$v) {
if ($this->execAdd($this->getInfoByShopUrl($v))) {
echo 'Add Success!!';
} else {
echo 'Add Faild!!';
}
}
}

/**
* 执行添加到数据库
* @param ArrayObject $infoArr
* @return Number 受影响的行数
*/
private function execAdd($infoArr) {
$mysqli = $this->getDb();
if (!emptyempty($infoArr['company'])) {
if (!$this->isExists($mysqli, $infoArr)) {
$num = $mysqli->query("INSERT INTO weiku(company,person,phone,fax,mobile,qq,msn,email,address,shopUrl) VALUES ('{$infoArr['company']}','{$infoArr['person']}','{$infoArr['phone']}','{$infoArr['fax']}','{$infoArr['mobile']}','{$infoArr['qq']}','{$infoArr['msn']}','{$infoArr['email']}','{$infoArr['address']}','{$infoArr['shopUrl']}')");
return $num;
} else {
return false; # 表示数据已经存在
}
} else {
return false;
}
}

/**
* 连接数据库
*/
private function getDb() {
$mysqli = new mysqli('localhost', 'root', '1715544', 'weiku');
$mysqli->query('SET NAMES GB2312');
return $mysqli;
}

/**
* 检查公司是否已经存在
* @param Resource $mysqli
* @param ArrayObject $infoArr
* @return bool
*/
private function isExists($mysqli, $infoArr) {
$mysqli->query("SELECT company FROM weiku WHERE company = '{$infoArr['company']}'");
if ($mysqli->affected_rows) {
return true;
} else {
return false;
}
}

/**
* 抓取信息
* @param $url
* @return ArrayObject
*/
private function getInfoByShopUrl($url) {
$re = $this->getUrlInfo($url);
preg_match_all('/公司名称:(.*)/Usi', $re, $companyArr);
preg_match_all('/联系人:(.*)/Usi', $re, $personArr);
preg_match_all('/电话:(.*)/Usi', $re, $phoneArr);
preg_match_all('/传真:(.*)/Usi', $re, $faxArr);
preg_match_all('/手机:(.*)/Usi', $re, $mobileArr);
preg_match_all('/QQ:(.*)/Usi', $re, $qqArr);
preg_match_all('/MSN:(.*)/Usi', $re, $msnArr);
preg_match_all('/E-Mail:(.*)/Usi', $re, $emailArr);
preg_match_all('/公司地址:(.*)/Usi', $re, $addressArr);
$infoArr = array(
'company'=>$this->stripATags($companyArr[1][0]),
'person'=>trim($personArr[1][0]),
'phone'=>trim($phoneArr[1][0]),
'fax'=>trim($faxArr[1][0]),
'mobile'=>trim($mobileArr[1][0]),
'qq'=>$this->formatQqMsn($qqArr[1][0]),
'msn'=>$this->formatQqMsn($msnArr[1][0], 'MSN'),
'email'=>$this->stripATags($emailArr[1][0]),
'address'=>trim($addressArr[1][0]),
'shopUrl'=>$url
);
return $infoArr;
}

/**
* 根据页面获取供应商 url 数组
* @param string $re
* @return ArrayObject
*/
private function shopUrlMatchReArr($re) {
$re = preg_replace('//', '', $re);
$re = preg_replace('//', '', $re);
$re = preg_replace('/[A-Z]/', '', $re);
$re = preg_replace('/
[0-9]/', '', $re);
$re = preg_replace('/
.*/', '', $re);
$re = preg_replace('/
.*/', '', $re);
$re = preg_replace('/
营业执照/', '', $re);
$re = preg_replace('/
该企业更多资质>>/', '', $re);
$re = preg_replace('/
点此反馈/', '', $re);
$re = preg_replace('/
首页/', '', $re);
$re = preg_replace('/
IC/', '', $re);
$re = preg_replace('/
简洁/', '', $re);
$re = preg_replace('/
信用/', '', $re);
$re = preg_replace('/
.*更多报价信息>>/', '', $re);
$re = preg_replace('/
.*/', '', $re);
$re = preg_replace('/
.*/', '', $re);
preg_match_all('/
.+/Usi', $re, $arr);
$arr = $this->formatUrlArr(array_unique($arr[1]));
return $arr;
}

/**
* 格式化数组
* @param Array $arr
* @return ArrayObject
*/
private function formatUrlArr($arr) {
$newArr = array();
foreach ($arr as $key=>$value) {
if ($this->isExistsHttp($value)) {
$newArr[$key] = $value;
}
}
return $newArr;
}

/**
* 格式化 QQ
* @param string $str
* @return string
*/
private function formatQqMsn($str, $e='QQ') {
if (emptyempty($str)) return '';
preg_match_all('/alt="'.$e.'\:(.+)"/Usi', $str, $arr);
if (count($arr[1])==1) return $arr[1][0];
$newStr = null;
foreach ($arr[1] as $value) {
$newStr .= $value . ' ';
}
return rtrim($newStr, ' ');
}

/**
* 供应商店铺链接添加 contact.html
* @param array $arr
* @return string
*/
private function shopAddContact($arr) {
foreach ($arr as $k=>$v) {
$arr[$k] = $v . '/contact.html';
}
return $arr;
}

/**
* 去掉网址的 A 标签
* @param string $site
* @return string
*/
private function stripATags($site) {
$site = preg_replace('/
(.+)/', '\1', $site);
return $site;
}

/**
* 检查 url 是否有 http
* @param string $url
* @return bool
*/
private function isExistsHttp($url) {
if (stristr($url, 'http://')) {
return true;
} else {
return false;
}
}

/**
* 获取页面内容
* @param Number $page
* @return string
*/
private function getContent($page=1) {
$re = file_get_contents($this->getUrl($this->key, $page));
return $re;
}

/**
* 获取页码
* @return Number
*/
private function getPageNum() {
$i = 1;
while (true) {
$re = $this->getContent($i);
# 处理单页避免处理死循环
if (!strstr($re, '下一页')) {
break;
} else {
# 多页,计算出页码
if (stristr($re, '下一页')) break;
$i++;
}
}
return $i;
}

/**
* 获取 URL 链接
* @param string $str
* @param int $page 页码
* @return string
*/
private function getUrl($str, $page=1) {
return "http://www.dzsc.com/ic/sell_search.html?keyword={$str}&ic_sel=supplygoods&Submit=%26%23160%3B&page={$page}"; }

/**
* 获取页面内容
* @param string $url
* @return string
*/
private function getUrlInfo($url) {
$re = file_get_contents($url);
return $re;
}
}

/*
程序运行思路:根据“华强电子网”的IC搜索功能,输入型号进行搜索,然后抓取供应商信息

数据库结构
CREATE TABLE `weiku` (
`id` mediumint(8) unsigned NOT NULL auto_increment COMMENT 'ID',
`company` varchar(300) default NULL COMMENT '公司名称',
`person` varchar(200) default NULL COMMENT '联系人',
`phone` varchar(300) default NULL COMMENT '电话',
`fax` varchar(300) default NULL COMMENT '传真',
`mobile` varchar(300) default NULL COMMENT '手机',
`qq` varchar(200) default NULL COMMENT 'QQ',
`msn` varchar(200) default NULL COMMENT 'MSN',
`email` varchar(300) default NULL COMMENT '邮箱',
`address` varchar(500) default NULL COMMENT '公司地址',
`shopUrl` varchar(200) default NULL COMMENT '维库网店铺地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
*/

$k = new weiku();
$arr = array_unique(array('MAX3232', 'AML8613', 'MT6225A', 'OM8373PS/N3/A', 'PT7313', 'MAX8212ESA', 'TL431', 'S3C2440', 'TMS320F2812PGFA', 'PCM1704', 'AN6717', 'CA3162E', 'CA3161E', 'LM393N', 'DS18B20', 'SHT10', 'AML8613', 'AN6717', 'LM393N', 'CA3161E', 'CA3162E', 'PCM1704', 'STK392-040', 'K1667', 'MAX232', 'STM32F103', 'LM358'));
foreach ($arr as $v) {
$k->go($v);
}
?>
/**
* 抓取“维库电子市场”供应商主程序
* author Lee.
* Last modify $Date: 2012-2-3 9:30:21 $
* 注:本程序按照编码 GB2312 执行,因为“维库电子市场”网站是GB2312编码,数据库也得保持一致
*/
class weiku {
private $key; // 型号
private $pageNum; // 页码

/**
* 入口程序
*/
public function go($key) {
$this->key = $key;
$this->pageNum = $this->getPageNum();
$this->getInfo();
}

/**
* 获取供应商 url 链接数组
* @return ArrayObject
*/
private function getInfo() {
if ($this->pageNum==1) { # 处理只有一页的情况
$arr = $this->shopAddContact($this->shopUrlMatchReArr($this->getContent()));
$this->isAddSuccess($arr);
} elseif ($this->pageNum>1) { # 多页
for ($i=1; $ipageNum; $i++) {
$arr = $this->shopAddContact($this->shopUrlMatchReArr($this->getContent($i)));
$this->isAddSuccess($arr);
}
}
}

/**
* 打印是否添加成功
* @param ArrayObject $arr
* @return string
*/
private function isAddSuccess($arr) {
foreach ($arr as $k=>$v) {
if ($this->execAdd($this->getInfoByShopUrl($v))) {
echo 'Add Success!!';
} else {
echo 'Add Faild!!';
}
}
}

/**
* 执行添加到数据库
* @param ArrayObject $infoArr
* @return Number 受影响的行数
*/
private function execAdd($infoArr) {
$mysqli = $this->getDb();
if (!empty($infoArr['company'])) {
if (!$this->isExists($mysqli, $infoArr)) {
$num = $mysqli->query("INSERT INTO weiku(company,person,phone,fax,mobile,qq,msn,email,address,shopUrl) VALUES ('{$infoArr['company']}','{$infoArr['person']}','{$infoArr['phone']}','{$infoArr['fax']}','{$infoArr['mobile']}','{$infoArr['qq']}','{$infoArr['msn']}','{$infoArr['email']}','{$infoArr['address']}','{$infoArr['shopUrl']}')");
return $num;
} else {
return false; # 表示数据已经存在
}
} else {
return false;
}
}

/**
* 连接数据库
*/
private function getDb() {
$mysqli = new mysqli('localhost', 'root', '1715544', 'weiku');
$mysqli->query('SET NAMES GB2312');
return $mysqli;
}

/**
* 检查公司是否已经存在
* @param Resource $mysqli
* @param ArrayObject $infoArr
* @return bool
*/
private function isExists($mysqli, $infoArr) {
$mysqli->query("SELECT company FROM weiku WHERE company = '{$infoArr['company']}'");
if ($mysqli->affected_rows) {
return true;
} else {
return false;
}
}

/**
* 抓取信息
* @param $url
* @return ArrayObject
*/
private function getInfoByShopUrl($url) {
$re = $this->getUrlInfo($url);
preg_match_all('/公司名称:(.*)/Usi', $re, $companyArr);
preg_match_all('/联系人:(.*)/Usi', $re, $personArr);
preg_match_all('/电话:(.*)/Usi', $re, $phoneArr);
preg_match_all('/传真:(.*)/Usi', $re, $faxArr);
preg_match_all('/手机:(.*)/Usi', $re, $mobileArr);
preg_match_all('/QQ:(.*)/Usi', $re, $qqArr);
preg_match_all('/MSN:(.*)/Usi', $re, $msnArr);
preg_match_all('/E-Mail:(.*)/Usi', $re, $emailArr);
preg_match_all('/公司地址:(.*)/Usi', $re, $addressArr);
$infoArr = array(
'company'=>$this->stripATags($companyArr[1][0]),
'person'=>trim($personArr[1][0]),
'phone'=>trim($phoneArr[1][0]),
'fax'=>trim($faxArr[1][0]),
'mobile'=>trim($mobileArr[1][0]),
'qq'=>$this->formatQqMsn($qqArr[1][0]),
'msn'=>$this->formatQqMsn($msnArr[1][0], 'MSN'),
'email'=>$this->stripATags($emailArr[1][0]),
'address'=>trim($addressArr[1][0]),
'shopUrl'=>$url
);
return $infoArr;
}

/**
* 根据页面获取供应商 url 数组
* @param string $re
* @return ArrayObject
*/
private function shopUrlMatchReArr($re) {
$re = preg_replace('//', '', $re);
$re = preg_replace('//', '', $re);
$re = preg_replace('/[A-Z]/', '', $re);
$re = preg_replace('/
[0-9]/', '', $re);
$re = preg_replace('/
.*/', '', $re);
$re = preg_replace('/
.*/', '', $re);
$re = preg_replace('/
营业执照/', '', $re);
$re = preg_replace('/
该企业更多资质>>/', '', $re);
$re = preg_replace('/
点此反馈/', '', $re);
$re = preg_replace('/
首页/', '', $re);
$re = preg_replace('/
IC/', '', $re);
$re = preg_replace('/
简洁/', '', $re);
$re = preg_replace('/
信用/', '', $re);
$re = preg_replace('/
.*更多报价信息>>/', '', $re);
$re = preg_replace('/
.*/', '', $re);
$re = preg_replace('/

.*/', '', $re);
preg_match_all('/
.+/Usi', $re, $arr);
$arr = $this->formatUrlArr(array_unique($arr[1]));
return $arr;
}

/**
* 格式化数组
* @param Array $arr
* @return ArrayObject
*/
private function formatUrlArr($arr) {
$newArr = array();
foreach ($arr as $key=>$value) {
if ($this->isExistsHttp($value)) {
$newArr[$key] = $value;
}
}
return $newArr;
}

/**
* 格式化 QQ
* @param string $str
* @return string
*/
private function formatQqMsn($str, $e='QQ') {
if (empty($str)) return '';
preg_match_all('/alt="'.$e.'\:(.+)"/Usi', $str, $arr);
if (count($arr[1])==1) return $arr[1][0];
$newStr = null;
foreach ($arr[1] as $value) {
$newStr .= $value . ' ';
}
return rtrim($newStr, ' ');
}

/**
* 供应商店铺链接添加 contact.html
* @param array $arr
* @return string
*/
private function shopAddContact($arr) {
foreach ($arr as $k=>$v) {
$arr[$k] = $v . '/contact.html';
}
return $arr;
}

/**
* 去掉网址的 A 标签
* @param string $site
* @return string
*/
private function stripATags($site) {
$site = preg_replace('/(.+)/', '\1', $site);
return $site;
}

/**
* 检查 url 是否有 http
* @param string $url
* @return bool
*/
private function isExistsHttp($url) {
if (stristr($url, 'http://')) {
return true;
} else {
return false;
}
}

/**
* 获取页面内容
* @param Number $page
* @return string
*/
private function getContent($page=1) {
$re = file_get_contents($this->getUrl($this->key, $page));
return $re;
}

/**
* 获取页码
* @return Number
*/
private function getPageNum() {
$i = 1;
while (true) {
$re = $this->getContent($i);
# 处理单页避免处理死循环
if (!strstr($re, '下一页')) {
break;
} else {
# 多页,计算出页码
if (stristr($re, '下一页')) break;
$i++;
}
}
return $i;
}

/**
* 获取 URL 链接
* @param string $str
* @param int $page 页码
* @return string
*/
private function getUrl($str, $page=1) {
retrn "http://www.dzsc.com/ic/sell_search.html?keyword={$str}&ic_sel=supplygoods&Submit=%26%23160%3B&page={$page}"u;


}

/**
* 获取页面内容
* @param string $url
* @return string
*/
private function getUrlInfo($url) {
$re = file_get_contents($url);
return $re;
}
}

/*
程序运行思路:根据“华强电子网”的IC搜索功能,输入型号进行搜索,然后抓取供应商信息

数据库结构
CREATE TABLE `weiku` (
`id` mediumint(8) unsigned NOT NULL auto_increment COMMENT 'ID',
`company` varchar(300) default NULL COMMENT '公司名称',
`person` varchar(200) default NULL COMMENT '联系人',
`phone` varchar(300) default NULL COMMENT '电话',
`fax` varchar(300) default NULL COMMENT '传真',
`mobile` varchar(300) default NULL COMMENT '手机',
`qq` varchar(200) default NULL COMMENT 'QQ',
`msn` varchar(200) default NULL COMMENT 'MSN',
`email` varchar(300) default NULL COMMENT '邮箱',
`address` varchar(500) default NULL COMMENT '公司地址',
`shopUrl` varchar(200) default NULL COMMENT '维库网店铺地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
*/

$k = new weiku();
$arr = array_unique(array('MAX3232', 'AML8613', 'MT6225A', 'OM8373PS/N3/A', 'PT7313', 'MAX8212ESA', 'TL431', 'S3C2440', 'TMS320F2812PGFA', 'PCM1704', 'AN6717', 'CA3162E', 'CA3161E', 'LM393N', 'DS18B20', 'SHT10', 'AML8613', 'AN6717', 'LM393N', 'CA3161E', 'CA3162E', 'PCM1704', 'STK392-040', 'K1667', 'MAX232', 'STM32F103', 'LM358'));
foreach ($arr as $v) {
$k->go($v);
}
?>


摘自 Lee.的专栏

抓取“维库电子市场”供应商程序

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • 抓取“维库电子市场”供应商程序
  • 专题推荐