その点(六)phpを開発して北京のリアルタイムバスのデータをつかむ

22182 ワード

開発の背景は自分で1項の北京のリアルタイムの公共交通の小さいプログラムを開発して、どのようにネット上で苦労してapiインタフェースを探しても成果がなくて、最後にネット上のデータのプロジェクトを登って構想するしかありません1爬虫類のフレームワーク-QueryList 2のデータ源の選定-北京の公共交通網3は需要によってdivをjson数にフォーマットして開発の実践1 QueryListのインストールに基づいて、composerを利用して直接インストールを行います点私は公式サイトに入って例を見ます
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ラベルの関係です.