首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

CodeIgniter 爬蟲實戰:phpQuery 解析分頁、遞歸下載圖片、輸出進度

     編輯:PHP 相關知識

CodeIgniter 爬蟲實戰:phpQuery 解析分頁、遞歸下載圖片、輸出進度

針對需翻頁查看的圖片網站,編寫 CodeIgniter 控制器腳本,使用 phpQuery 解析 HTML、提取分頁連結、逐頁下載圖片並儲存本地。附完整 View 代碼(含邏輯)與改進方向。

控制器準備

$this->load->helper('date');
$this->load->helper('phpQuery'); // 單文件 phpQuery 放入 helpers/

View 核心邏輯(原文直接在 View 執行,建議移至 Controller/Library)

<?php
// 1. 載入首頁,獲取分頁導航
$firstPage = phpQuery::newDocumentFile('https://g.e-hentai.org/g/xxxxx/xxxxxxx/');
$pageLinks = $firstPage->find('.ptt td a'); // 分頁連結選擇器

$pn = 1;
foreach ($pageLinks as $link) {
    $pageUrl = pq($link)->attr('href');
    echo "第 {$pn++} 頁: <a href='$pageUrl'>$pageUrl</a><br>";

    // 2. 載入分頁,提取圖片列表頁連結
    $pageDoc = phpQuery::newDocumentFile($pageUrl);
    $imageLinks = $pageDoc->find('#gdt a'); // 圖片列表選擇器

    foreach ($imageLinks as $imgLink) {
        $imgPageUrl = pq($imgLink)->attr('href');
        echo "<a href='$imgPageUrl'>$imgPageUrl</a><br>";

        // 3. 載入圖片詳情頁,提取真實圖片 URL
        $imgDoc = phpQuery::newDocumentFile($imgPageUrl);
        $realImgUrl = $imgDoc->find('#i3 img')->attr('src');
        echo "<img src='$realImgUrl'><br>";

        // 4. 下載並儲存
        ob_start();
        readfile($realImgUrl);
        $imgData = ob_get_contents();
        ob_end_clean();

        $filename = 'img/' . now() . '.jpg'; // now() 為 date_helper 函數
        $fp = fopen($filename, 'w');
        fwrite($fp, $imgData);
        fclose($fp);
    }
}
?>

關鍵技術點

環節工具/函數說明
HTML 解析phpQuery::newDocumentFile()支援 jQuery 選擇器語法,遠超正則
分頁遞歸foreach 迴圈 + 遞歸載入依賴網站結構固定
圖片下載readfile() + output buffering簡單但無斷點續傳、無並發
檔名生成date_helper::now()時間戳避免衝突,建議改用 hash

嚴重效能與健壯性問題(必須改進)

  1. 同步阻塞:每張圖片串列下載,速度極慢。→ 改用 curl_multi 或 Guzzle 異步 並發下載。
  2. 無錯誤重試:網路波動直接失敗。→ 加入重試機制(指數退避)。
  3. 記憶體洩漏:phpQuery 物件未銷毀。→ 每次迴圈結束 phpQuery::unloadDocuments()。
  4. 邏輯耦合在 View:違反 MVC。→ 移至 Library/Service 類別,Controller 僅調度。
  5. 無去重:重複圖片會重複下載。→ 用 URL MD5 做鍵值檢查。
  6. 無限流控:可能觸發目標站反爬封禁。→ 加入 sleep()、隨機 User-Agent、代理 IP 池。

現代化重構建議(Python/Golang 更適合)

# Python + requests + lxml + asyncio 範例架構
async def fetch(session, url):
    async with session.get(url) as resp:
        return await resp.text()

async def download_image(session, url, path):
    async with session.get(url) as resp:
        with open(path, 'wb') as f:
            async for chunk in resp.content.iter_chunked(8192):
                f.write(chunk)

# 使用 aiohttp + asyncio 實現高併發、可控流速、優雅錯誤處理

此腳本展示了「快速驗證想法」的典型寫法,但生產級爬蟲請務必遷移至異步框架並完善容錯體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved