PHP提取8684公交数据

最近一年来一直在使用fedora,发现linux真是太适合我了,喜欢写程序,自己瞎倒腾,唉windows误我大好年华……

用PHP写了一段程序用于提取网页中的数据,相信搜索引擎也是差不多的想法,只不过他们数据多,算法好些,呵呵

[php]

<?php
/*
*此文件的目标是自动搜集存储8684上的深圳市公交数据
*
*由于http获得的网页为gbk编码PHP需要转换,只能将PHP重新编译
*/

//载入simple_html_dom类分析HTML文件
include 'simple_html_dom.php';

//创建一个SQLite数据库用于存储数据
$db = new SQLite3 ('BusData.db');

if ($db) //数据库创建成功
{
//创建站点名表
$db->exec('CREATE TABLE stationName (id INTEGER PRIMARY KEY AUTOINCREMENT,sName STRING)');
//创建线路表sName,sNote,sTo,sFrom分别存储线路名,备注,去程,回程
$db->exec('CREATE TABLE Line (sName STRING, sNote STRING, sTo STRING, sFrom STRING)');
}

analysis($db, 'http://shenzhen.8684.cn/x_24f5dad9');

$db->close ();
echo "Congratulations! Write Sucessfully!";
//******************
//分析数据,插入数据部分
//******************

function analysis($db, $url)
{
$html = new simple_html_dom ();
$html->load_file ($url); //载入HTML文件,可以从本地,也可是URL

$LName = ''; //用于记录公交线路名称
foreach ($html->find ('div[id=show] h2 a') as $lineName)
{
// echo mb_strlen($lineName->plaintext).'word<p>';本来想去掉公交名称中的‘路'字,不过后来发现整个命名不标准,要去可能去的乱七八糟了
//记录公交路线名称
$LName = $LName.mb_strcut(mb_convert_encoding($lineName->plaintext,'UTF-8','gbk'),6);

}
//记录线路备注信息:
$note = '|';
foreach ($html->find ('div[id=show] li') as $Note)
$note = $note.mb_convert_encoding($Note->plaintext,'UTF-8','gbk').'|'; //将备注连接

$i = 0; //用以判断行程(去程/回程)
$s_To = '.'; //记录去程路线
$s_From = '.'; //记录回程路线

//输出公交站点信息
foreach ($html->find ('span') as $element)
{
$i++; //控制变量自增
//i为奇数时判断为去程
if ($i % 2)
{
foreach ($element->find ('a') as $stationName)
{
//查询第一个站点在数据库中是否存在,如果不存在,则插入当前站点
$s_Name = mb_convert_encoding($stationName->plaintext,'UTF-8','gbk'); //将字符转为utf-8编码,以免乱码
$sNameResult = $db->query('SELECT id FROM stationName WHERE sName=/''.$s_Name.'/'');

//判断数据库站点中没有当前站点 如果$sNameResult->fetchArray()返回false则说明数据库中没有站点信息
if (!$sNameResult->fetchArray ())
{
//插入站点名
//INTERT UPDAT DELETE 必须使用SQLite3::exec()方法,否则网页显示会有问题
$result = $db->exec('INSERT INTO stationName (sName) VALUES (/''.$s_Name.'/')');
// echo '新的站点名,可以插入数据库<br>';
$r = $db->query('SELECT id FROM stationName WHERE sName=/''.$s_Name.'/'');
//
//此句子为什么会发生错误///
// $s_To = $s_To.(($r->fetchArray(SQLITE_NUM))[0]);
/
// var_dump( $r->fetchArray(SQLITE_NUM));
//连接去程线路站点信息,以站点表中的ID进行存储
$temp = $r->fetchArray(SQLITE3_NUM);
$s_To = $s_To.$temp[0].'.';
// echo $s_To.'<br>';
}else{
$temp = $sNameResult->fetchArray(SQLITE3_NUM);
$s_To = $s_To.$temp.'.';
} //if结束
} //foreach结束
}else{
//i为偶数时判断为回程
foreach ($element->find ('a') as $stationName)
{
//查询第一个站点在数据库中是否存在,如果不存在,则插入当前站点
$s_Name = mb_convert_encoding($stationName->plaintext,'UTF-8','gbk');
$sResult = $db->query ('SELECT id FROM stationName WHERE sName=/''.$s_Name.'/'');

// echo '查询站点结果2:'.$s_Name.' '.$sResult->columnName (0).'<p>'; // var_dump($sResult->fetchArray()); //末查询到数据时为bool(false)

if (!$sResult->fetchArray ())
{
//如果站点名不存在于数据库中,则插入新的站点名
$result = $db->exec('INSERT INTO stationName (sName) VALUES (/''.$s_Name.'/')');
// echo '新的站点名,可以插入数据库<br>';
}
//
//在数据库中检索当前站点名获取其ID
//此方法自我感觉比较消耗时间,不知道有没有什么好的办法//
///
$r = $db->query('SELECT id FROM stationName WHERE sName=/''.$s_Name.'/'');
$temp = $r->fetchArray(SQLITE3_NUM);
//连接回程线路站点信息,以站点表中的ID进行存储
$s_From = $s_From.$temp[0].'.';
} //foreach end
}// end if
} // end foreach

$sInsert = 'INSERT INTO Line (sName, sNote, sTo, sFrom) VALUES (/''.$LName.'/',/''.$note.'/',/''.$s_To.'/',/''.$s_From.'/')';

$db->exec($sInsert);
echo $LName.'<p>';
///
//当前线路的数据获取完毕
//


//下面开始搜索div[id=key]中数据,以此循环得到整个城市公交数据
/
/* $keyName = new array();
$keyUrl = new array();
$i_A = 0;
*/
foreach ( $html->find('div[id=key] a') as $key)
{
// $keyArray[$i_A] = mb_convert_encoding($key->plaintext, 'UTF-8', 'gbk');
//时刻注意从网页中获取的数据编码问题
$aName = mb_convert_encoding($key->plaintext, 'UTF-8', 'gbk');
echo $aName.'<br>';
//查询当前线路名在数据库中是否存在,如果存在则返回
$sqlIn = 'SELECT sName From Line WHERE sName=/''.$aName.'/'';
$isNew = $db->query($sqlIn);

if ( $isNew->fetchArray() )
{
continue;
}else{
$key_url = 'http://shenzhen.8684.cn/'.mb_convert_encoding($key->href, 'UTF-8', 'gbk');
analysis($db, $key_url); //递归调用
}
} //end foreach

} //end function
?>

[/php]

 

其中simple_html_dom.php文件是一个用PHP写的开源解析器,相当好用

 

不过本程序有点问题,不知道为什么不能递归提取完全,深圳的数据大概提取40多条线路(约800多个站点)就完了,如果有人发现问题请指教,谢谢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值