iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
Modern Web

寫給PHP開發者的30堂網路爬蟲開發系列 第 24

Day 24:案例研究 3-1 凱基證券網站爬蟲實做

  • 分享至 

  • xImage
  •  

前言

從昨天的網站分析,我們可以知道爬蟲實做,與回應網站內容擷取的大概做法。

在今日,要做的事情是,將此網站爬蟲給實做出來,並找到收盤價檔案的列表。

爬蟲實做

首先,先將我們所需要的爬蟲開發環境給建置起來,以下面指令為例子:

docker run --name=php_crawler -d -it php_crawler bash

接著,打開自己偏好的程式編輯並開啟檔案叫做「lab3-1-closing-price.php」並輸入下面的程式碼內容:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;

$closingPriceLink = 'https://www.kgieworld.com.tw/Stock/stock_2_7.aspx?findex=1';

$client = new Client(['cookies' => true]);
$response = $client->request('GET', $closingPriceLink);

$responseString = (string)$response->getBody();
$viewState = '__VIEWSTATE';
$eventValidation = '__EVENTVALIDATION';
$viewStateGenerator = '63FF896A';

$closingPriceFileContents = [
    'lbtnDown01' => '',
    'lbtnDown02' => '',
    'lbtnDown03' => '',
    'lbtnDown04' => '',
    'lbtnDown05' => '',
];

$closingPriceDates = [
    'lblDate01' => '',
    'lblDate02' => '',
    'lblDate03' => '',
    'lblDate04' => '',
    'lblDate05' => '',
];

$crawler = new Crawler($responseString);

$crawler
   ->filter('input[type="hidden"]')
   ->reduce(function (Crawler $node, $i) {
        global $viewState;
        global $eventValidation;

        if ($node->attr('name') === $viewState) {
            $viewState = $node->attr('value');
        }
        if ($node->attr('name') === $eventValidation) {
            $eventValidation = $node->attr('value');
        }
   });

foreach ($closingPriceDates as $btnDateKey => $btnDate) {
    $crawler
        ->filter('span[id="' . $btnDateKey . '"]')
        ->reduce(function (Crawler $node, $i) {
            global $closingPriceDates;
            global $btnDateKey;
            $closingPriceDates[$btnDateKey] = $node->text();
    });
}

var_dump($closingPriceDates);

接著,把此PHP程式檔案複製到Docker容器中,利用下列的指令:

docker cp lab3-1-closing-price.php php_crawler:/root/

並執行下面的PHP程式:

docker exec -it php_crawler php lab3-1-closing-price.php

接著,會得到下面的結果:

array(5) {
  ["lblDate01"]=>
  string(10) "2019-10-09"
  ["lblDate02"]=>
  string(10) "2019-10-08"
  ["lblDate03"]=>
  string(10) "2019-10-07"
  ["lblDate04"]=>
  string(10) "2019-10-04"
  ["lblDate05"]=>
  string(10) "2019-10-03"
}

爬蟲實做方法如下:

  • 因為已經知道日期對應的span元素屬性為:「lblDate01」到「lblDate05」,所以就先宣告好這個關聯陣列
  • 接著依序將關聯陣列中的鍵值取出並去擷取相對應的元素的文字出來,文字對應到即是收盤日期
  • 另外,可以知道每個收盤價檔案下載的事件目標,也就是表單參數中的__EVENTTARGET
  • 上述這件事情,將會再明日實做,拿到對應的收盤價檔案了

結論

這邊做一個今日的小結,本日實做了此網站的爬蟲,拿到每日的收盤價日期與對應的收盤價檔案的表單參數。

在明日,我將會將對應的收盤價日期的收盤價檔案下載回來,敬請期待!


上一篇
Day 23:案例研究 3-1 分析凱基證券網站與內容擷取方法
下一篇
Day 25:案例研究 3-1 凱基證券網站內容之收盤價檔案下載擷取
系列文
寫給PHP開發者的30堂網路爬蟲開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言