[問題] 呼叫奇摩api抓出大量地址的經緯度
您好
我有一些問題想請教版上的諸位高手
最近我要利用yahoo的map api來抓出地址的經緯度
而且是處理大量的地址
不過yahoo的map api是用javascript呼叫
而我從網頁取出地址的程式是用php寫的
而我的寫法如下:
get_address.php:
<?
require 'test7.php';
for($u=50000;$u<=50000;$u++){
$filename = file_get_contents("C:\Program Files\Teleport
Pro\Projects\ptt_food/{$u}.html");
$fp = fopen('C:\AppServ\www\geo\address', 'w');
$pattern = '/(([台臺][北中南東]|北|高|宜蘭|花蓮|金門|南投|屏東|苗栗|桃園|高雄|
基隆|連江|雲林|新竹|嘉義|彰化|澎湖)[縣市].{0,5}(鄉|鎮|市|區)?.{0,5}(路|街|村|
里|大道|段).{0,3}(段)?.{0,5}(號)?.{0,3}(樓|F|f)?[^ \n])/u';
preg_match($pattern, $filename,$matches);
$pattern2 ='/([\x{0020} \x{002d} \x{0030}-\x{0039} \x{003f} \x{0041}-\x{005a}
\x{0061}-\x{007a} \x{007e} \x{4e00}-\x{fa2d} \x{fe56} \x{fe63}
\x{ff10}-\x{ff19} \x{ff21}-\x{ff3a} \x{ff41}-\x{ff5a}]+)/u';
preg_match($pattern2, $matches[0],$matches);
if($a!=0){
for($p=0;$p<$a;$p++){
$catch[$p] = $matches[0][$p];
}
}
else{
$catch[]= $matches[0];
}
$k=0;
if($catch[$k]!=null){
while($catch[$k]!=null){
fwrite($fp,$catch[$k]);
$k++;
}
$ok="C:/AppServ/www/geo/address";
$lol = file_get_contents("C:/AppServ/www/geo/address");
$lol= iconv("UTF-8","big5",$lol);
if(file_put_contents($ok, $lol)){
map($u);
}
$userdata=null;
$catch=null;
$ll=null;
$matches=null;
$lol=null;
$ok=null;
}
$userdata=null;
$catch=null;
$ll=null;
$matches=null;
fclose($fp);
echo "<BR>";
}
?>
test7.php:
<?
require 'get_latlon.php';
function map($u){?>
<html>
<head>
<script type="text/javascript"
src="" rel="nofollow">http://tw.api.maps.yahoo.com/ajaxymap?v=3.8&appid=bIBJX23V34FZfj_o_CnnjraiWBawSpmqVa8jXFr548QYnb5UYNI2deAQFEsu"></script>
</head>
<body>
<div id="map"></div>
<script type="text/javascript">
var map = new YMap(document.getElementById('map'),YAHOO_MAP_REG,new
YSize(0,0));
var fso = new ActiveXObject("Scripting.FileSystemObject");
var fso2 = new ActiveXObject("Scripting.FileSystemObject");
var txtFile = fso.OpenTextFile("C:/AppServ/www/geo/lat_lon.txt", 2,
false, 0);
var txtFile2 = fso2.OpenTextFile("C:/AppServ/www/geo/address", 1, false, 0);
var fText = txtFile2.ReadLine();
function startMap(){
YEvent.Capture(map, EventsList.endMapDraw , reportPosition);
map.drawZoomAndCenter(fText, 1);
function reportPosition(_e, _c){
var mapCoordCenter = map.convertLatLonXY(map.getCenterLatLon());
txtFile.WriteLine(map.YGeoPoint.Lat);
txtFile.WriteLine(map.YGeoPoint.Lon);
}
}
window.onload = startMap;
</script>
</body>
</html>
<?
latlon($u);
}?>
get_latlon.php:
<?
function latlon($u){
$ll=file("C:/AppServ/www/geo/lat_lon.txt");
$ad=file("C:/AppServ/www/geo/address");
$post=array('address' => $ad, 'lat' => $ll[0], 'lon' => $ll[1]);
if (($file_content = file_get_contents('C:/AppServ/www/geo/geoinfo')) ===
false) die("can't open geoinfo");
$userdata = unserialize($file_content);
if (empty($userdata)) $userdata = array();
$userdata[$u]=$post;
file_put_contents('C:/AppServ/www/geo/geoinfo', serialize($userdata)) or
die ("can't save to geoinfo");
$ad=null;
$ll=null;
$userdata=null;
$post=null;
}
?>
我爬過文
先前有高手跟前輩分享過php跟javascript之間傳值的方法
不過我不知道為何
我沒辦法傳
所以我想了一個方法
就是先用php寫到文件檔
再用javascript去讀那個文件檔
我的流程如下:
從編號$u的網頁中取出地址
因為api只讀Big5
所以把utf-8轉為Big5
然後寫到檔案address裡
接著呼叫map($u)
利用map($u)裡的javascript
去讀檔案address的地址
然後傳給yahoo
等他傳回來
我再寫入lat_lon.txt
接著呼叫latlon($u)
把地址跟經緯度寫入檔案
我發現一次做一個ok
地址寫進去了
經緯度也抓到了
可是當我的for迴圈
要跑兩篇以上的網頁(例如:編號50000跟編號50001的網頁,這些網頁我已經事先抓好
存在電腦裡)
他就掛了
不曉得我到底該怎麼改
才能成功
是應該推倒
全部重寫
還是
到php.js
利用javascript全部寫出我php的程式
版上有高手前輩說過
php跟javascript分別是server端和client端語言
也說過
PHP跑完 跑出網頁 裡面有js 在瀏覽器上執行js 不會有什麼PHP跑到一半去呼叫js的
不過我還是蠻模糊的
煩請各位高不吝賜教
感謝
感謝
<(_ _)>
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.64.112
※ 編輯: KHW 來自: 114.32.64.112 (09/02 05:38)
※ 編輯: KHW 來自: 114.32.64.112 (09/02 05:53)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):