iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1
Modern Web

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

Day 17:案例研究 2-1 實做課程查詢網站爬蟲

  • 分享至 

  • xImage
  •  

前言

昨天我們可以知道,課程查詢網站分析,接著今日就要將昨天的分析拿還實做成今日的爬蟲。

實做

實做爬蟲前,跟前幾次一樣,要先啟動先前建置好的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 clientcookie設定成true,意思是每次的請求,cookie是可以共用,並幫我們把cookie傳送出去。

拿到回應的內容之後,接著要解析裡面的內容了,那些內容在後續的POST方法請求課程列表會使用到。

重要的欄位分別是:__VIEWSTATE__EVENTVALIDATION。這兩個隱藏的欄位值最主要是用來驗證發出去的表單與接收的人是同一個。類似像是CSRF-Token的概念。

這是ASP.NET會使用到的方法。

把上述這兩個欄位擷取出來之後,接著就可以存到相對應的變數了。那今日的實做也就完成了。

結論

今日一開始的課程查詢網站爬蟲最主要是將第一步,進入課程查詢網站的頁面中需要利用POST方法做課程查詢用到的欄位做紀錄,以便在日後可以擷取到正確的課程查詢列表清單。

在明日,就會接續今日的爬蟲實做利用POST方法將今日拿到的欄位一併送到後端並拿到課程查詢結果清單的爬蟲實做。

以及一些遇到的問題以及解決的方法,敬請期待!


上一篇
Day 16:案例研究 2-1 分析課程查詢網站
下一篇
Day 18:案例研究 2-1 實做課程查詢網站爬蟲-part2
系列文
寫給PHP開發者的30堂網路爬蟲開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言