針對需翻頁查看的圖片網站,編寫 CodeIgniter 控制器腳本,使用 phpQuery 解析 HTML、提取分頁連結、逐頁下載圖片並儲存本地。附完整 View 代碼(含邏輯)與改進方向。
$this->load->helper('date');
$this->load->helper('phpQuery'); // 單文件 phpQuery 放入 helpers/
<?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 |
curl_multi 或 Guzzle 異步 並發下載。phpQuery::unloadDocuments()。sleep()、隨機 User-Agent、代理 IP 池。# 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 實現高併發、可控流速、優雅錯誤處理
此腳本展示了「快速驗證想法」的典型寫法,但生產級爬蟲請務必遷移至異步框架並完善容錯體系。