昨天我們可以知道,課程查詢網站分析,接著今日就要將昨天的分析拿還實做成今日的爬蟲。
實做爬蟲前,跟前幾次一樣,要先啟動先前建置好的Docker container爬蟲開發環境。
docker run --name=php_crawler -d -it php_crawler bash
啟動之後,利用docker ps
來確定Docker container有確定運行。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a9d634a10cc php_crawler "bash" 4 minutes ago Up 4 minutes php_crawler
接著,新增一個檔案叫做lab2-1.php
,加入下面的程式碼:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;
$publicCourses = 'https://infosys.nttu.edu.tw/n_CourseBase_Select/CourseListPublic.aspx';
$headers = [
'Host' => 'infosys.nttu.edu.tw',
'Connection' => 'keep-alive',
'Cache-Control' => 'max-age=0',
'Upgrade-Insecure-Requests' => '1',
'Sec-Fetch-Mode' => 'navigate',
'Sec-Fetch-User' => '?1',
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 application/signed-exchange;v=b3',
'Sec-Fetch-Site' => 'none',
'Referer' => 'https://infosys.nttu.edu.tw/',
'Accept-Encoding' => 'gzip, deflate, br',
'Accept-Language' => 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13',
];
$client = new Client(['cookies' => true]);
$response = $client->request('GET', $publicCourses, [
'debug' => true,
'headers' => $headers,
]);
$publicCourseString = (string)$response->getBody();
$viewState = '__VIEWSTATE';
$eventValidation = '__EVENTVALIDATION';
$viewStateGenerator = '5D156DDA';
$crawler = new Crawler($publicCourseString);
$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');
}
});
首先,要先使用GET
方法請求課程查詢的網址,接著再拿到回應的內容,那因為後續還會有一個POST
方法去拿到第一頁的課程清單,因此會將new Client(['cookie' => true])
。
這指的是說,將HTTP client
的cookie
設定成true
,意思是每次的請求,cookie
是可以共用,並幫我們把cookie
傳送出去。
拿到回應的內容之後,接著要解析裡面的內容了,那些內容在後續的POST
方法請求課程列表會使用到。
重要的欄位分別是:__VIEWSTATE
與__EVENTVALIDATION
。這兩個隱藏的欄位值最主要是用來驗證發出去的表單與接收的人是同一個。類似像是CSRF-Token
的概念。
這是ASP.NET
會使用到的方法。
把上述這兩個欄位擷取出來之後,接著就可以存到相對應的變數了。那今日的實做也就完成了。
今日一開始的課程查詢網站爬蟲最主要是將第一步,進入課程查詢網站的頁面中需要利用POST
方法做課程查詢用到的欄位做紀錄,以便在日後可以擷取到正確的課程查詢列表清單。
在明日,就會接續今日的爬蟲實做利用POST
方法將今日拿到的欄位一併送到後端並拿到課程查詢結果清單的爬蟲實做。
以及一些遇到的問題以及解決的方法,敬請期待!