我想問一下,關於爬蟲爬圖片,假設以論壇的表特版為例子,
寫出了爬蟲抓到文章1的裡面圖片網址,接下來url填進去就可以下載任何文章n的圖片。
不過如果當我要一次下載好幾篇的時候,
我又要針對表特版分頁本身做一次爬蟲:找到所有文章的url,
再去文章裡面找到圖片url,就可以抓到圖片了。
所以當我要做這種大量爬好多篇文章的時候,是否就會進入「ajax地獄」:
ajax裡面ajax裡面ajax裡面ajax這樣XDD
之前我寫抓圖是也都這樣寫,運作沒問題,
只是突然在想這種pattern是否是符合常情的XD?
還是說本來就是這樣,不意外σ(´∀`*)
我的另一種做法是分成兩支程式,一支丟出一堆url當作參數,
阿我自己手動再貼進去主程式跑這樣。
但通常還是硬塞ajax裡面ajax 程式就超大一坨這樣(๑• . •๑)
關於這樣子的行為,是否有比較合適的操作方法呢?
或者這無論優劣?都可以討論~
歡迎爬蟲大師前輩們分享一下,自己的經驗跟想法,討論看看囉~~
你可以準備一個url的陣列,在ajax時就從陣列裏一個一個去抓
每抓完一個url之後,分析裏面的內容,再把新找到想抓的url丟進url陣列
這樣程式看起來就會很清爽
let urlList: string[] = [
'https://gamelet.online' // 首頁
];
let fetchedUrls: string[] = [];
// 抓一個url的內容並分析
async function fetchURL(url: string) {
if (fetchedUrls.includes(url)) {
// 這個網址之前已經抓過了
return Promise.resolve();
}
fetchedUrls.push(url);
let response = await fetch(url);
let contentType = response.headers.get('content-type');
if (contentType.startsWith('image/')) {
... 儲存圖片...
} else if (contentType == 'text/html') {
let content = await response.text();
... 儲存內文...
// 找出頁面中其他的url,加進urlList
searchOtherUrls(content).forEach(url => urlList.push(url));
}
}
// 抓全部
async function fetchAll() {
while (urlList.length) {
await fetchURL(urlList.shift());
}
}
// 開始抓
fetchAll();
fetchAll會把網址從urlList裏面一個一個拿出來呼叫fetchURL()下載內容。
而fetchURL會在結束前,把新的url丟進去urlList,讓fetchAll把新找到的url也依序進行處理。
大概這思路吧?
const fetchA = async () => {
try {
const res = await fetch(url)
return res
} catch (error){
throw error
}
}
const fetchB= async () => {
try {
const res = await fetch(url)
return res
} catch (error){
throw error
}
}
const combineApi = async () => {
try {
const res = await fetchA()
const res = await fetchB()
} catch (error){
throw error
}
}