その点(六)phpを開発して北京のリアルタイムバスのデータをつかむ
22182 ワード
開発の背景は自分で1項の北京のリアルタイムの公共交通の小さいプログラムを開発して、どのようにネット上で苦労してapiインタフェースを探しても成果がなくて、最後にネット上のデータのプロジェクトを登って構想するしかありません1爬虫類のフレームワーク-QueryList 2のデータ源の選定-北京の公共交通網3は需要によってdivをjson数にフォーマットして開発の実践1 QueryListのインストールに基づいて、composerを利用して直接インストールを行います点私は公式サイトに入って例を見ます
コントローラで参照
2データソースインタフェースの決定
走行方向の取得
コンテンツを返す
走行状況の取得
コンテンツを返す
3 divをjsonにフォーマットしてバス路線を取得するのは簡単で、2つのaラベルしかありません.textとuuidを取得するだけでいいです.以下はコードです.
バスの走行状況を取得するのは複雑で、spanラベルとiラベルの関係に注意する必要があります
4最終フォーマット完了後のjsonデータバス路線
バス情報(buscは途中車両、bussは到着車両)
総じて言えば、比較的簡単で、注意しなければならないのは2つのインタフェースが関連している場所uuidとspanとiラベルの関係です.
composer require jaeger/querylist
コントローラで参照
find('img')->attrs('src');
//
print_r($data->all());
}
}
2データソースインタフェースの決定
走行方向の取得
http://www.bjbus.com/home/ajax_rtbus_data.php?act=getLineDir&selBLine=428
コンテンツを返す
428( - )
428( - )
走行状況の取得
http://www.bjbus.com/home/ajax_rtbus_data.php?act=busTime&selBLine=1&selBDir=
コンテンツを返す
{
"html": "428
-
5:30-23:00
...
...
...
...
...
...
...
...
...
...
...
...
",
"w": 1532,
"seq": "1"
}
3 divをjsonにフォーマットしてバス路線を取得するのは簡単で、2つのaラベルしかありません.textとuuidを取得するだけでいいです.以下はコードです.
public function getBusLine($busName)
{
$rules = [
//
'name' => ['a', 'text'],
// uuid
'uuid' => ['a', 'data-uuid']
];
//
$data = QueryList::get('http://www.bjbus.com/home/ajax_rtbus_data.php?act=getLineDir&selBLine=' . $busName
)->rules($rules)->query()->getData();;
//
$result = $data->all();
if (count($result) === 0) {
throw new ParameterException(['msg' => ' ']);
}
for ($i = 0; $i < count($result); $i++) {
$array = explode('(', $result[$i]['name']);
$result[$i]['name'] = $array[0];
$result[$i]['busLine'] = substr($array[1], 0, strlen($array[1]) - 1);
}
return $result;
}
バスの走行状況を取得するのは複雑で、spanラベルとiラベルの関係に注意する必要があります
public function getBusInfo($uuid)
{
$rules = [
//
'status' => ['div>i', 'class'],
'name' => ['div>span', 'title'],
'headInfo' => ['article>p', 'text']
];
$result = get('http://www.bjbus.com/home/ajax_rtbus_data.php?act=busTime&selBLine=1&selBDir=' . $uuid . '&selBStop=1');
$result = json_decode($result, true);
if (!array_key_exists('html', $result)) {
throw new ParameterException(['msg' => ' ']);
}
$data = QueryList::html($result['html'])->rules($rules)->query()->getData();
$busResult = $data->all();
$result = [
'time' => '',
'busInfo' => [],
'busc' => 0
];
$result['time'] = $busResult[0]['headInfo'];
//for
for ($i = 0; $i < count($busResult) / 2; $i++) {
$resultItem = [];
$resultItem['busName'] = $busResult[$i]['name'];
if ($i == 0) {
$resultItem['buss'] = $busResult[$i]['status'] == 'buss';
$resultItem['busc'] = $busResult[$i + 1]['status'] == 'busc';
if ($resultItem['buss']) {
$result['busc'] = $result['busc'] + 1;
}
if ($resultItem['busc']) {
$result['busc'] = $result['busc'] + 1;
}
} else {
$resultItem['buss'] = $busResult[($i * 2)]['status'] == 'buss';
if ($resultItem['buss']) {
$result['busc'] = $result['busc'] + 1;
}
if ($i !== (count($busResult) - 1) / 2) {
$resultItem['busc'] = $busResult[($i * 2 + 1)]['status'] == 'busc';
if ($resultItem['busc']) {
$result['busc'] = $result['busc'] + 1;
}
}
}
array_push($result['busInfo'], $resultItem);
}
return $result;
}
4最終フォーマット完了後のjsonデータバス路線
{
"responseCode": 0,
"responseMessage": " ",
"data": [
{
"name": "428",
"uuid": "4907320871547002333",
"busLine": " - "
},
{
"name": "428",
"uuid": "5415569149649522461",
"busLine": " - "
}
]
}
バス情報(buscは途中車両、bussは到着車両)
{
"responseCode": 0,
"responseMessage": " ",
"data": {
"time": " 5:30-23:00 ",
"busInfo": [
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false,
"busc": true
},
{
"busName": " ",
"buss": false,
"busc": false
},
{
"busName": " ",
"buss": false
}
],
"busc": 1
}
}
総じて言えば、比較的簡単で、注意しなければならないのは2つのインタフェースが関連している場所uuidとspanとiラベルの関係です.