從昨天的網站分析,我們可以知道爬蟲實做,與回應網站內容擷取的大概做法。
在今日,要做的事情是,將此網站爬蟲給實做出來,並找到收盤價檔案的列表。
首先,先將我們所需要的爬蟲開發環境給建置起來,以下面指令為例子:
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
這邊做一個今日的小結,本日實做了此網站的爬蟲,拿到每日的收盤價日期與對應的收盤價檔案的表單參數。
在明日,我將會將對應的收盤價日期的收盤價檔案下載回來,敬請期待!