作者vi000246 (Vi)
看板java
標題[問題] 爬蟲正規表達式的效能
時間Wed Oct 19 09:55:18 2016
我寫了一支爬蟲用來爬A網址
要從A網址回傳的HTML裡濾出圖床網址
程式要從圖床網址來取得大圖
每個圖床取大圖的邏輯都不一樣
我目前寫的邏輯如下
1.先取得A網址的HTML
2.過濾不要的區塊 因為圖床網址出現的地方不固定
我沒辨法先濾出
http://...jpg的連結再判斷圖床
3.為各網址寫REGEX過濾出網址再執行各自的取大圖邏輯
REGEX語法如下
(?<url>https?://
[\d\w_.]*
(?:imgdream|imgblank|img.yt|dimtus|imgstudio|damimage|imgseed|55888|imageteam|imagedecode|hentai|tinypic|pics.dmm)
(?:[\d\w-_./]*)[\d\w-_.]*.jpe?g)
(?<url>https?://[\d\w-_.]*(?:imgchili)(?:[\d\w-_./]*)[\d\w-_.]*.jpe?g)
(?<url>https?://1dl.biz(?:[\d\w-_./\?]*)[\d\w-_.]*)
我覺得這樣做效率滿低的
一個頁面要重覆判斷好幾次
想問有沒有辨法一次判斷是屬於哪個圖床
再執行各自取大圖邏輯?
我怕寫在一起 REGEX會越寫越長 很不好維護
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.61.240.91
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1476842121.A.BF5.html
1F:→ pttworld: 一次建立html的tag組對,非圖的也有其他處理需要使用。 10/19 13:57
2F:→ vi000246: 我目前是把會出現網址的DIV區塊濾出來判斷有沒有網址 再 10/19 14:05
3F:→ vi000246: 一個一個判斷網址的HOST 10/19 14:05
4F:→ pttworld: 可能需要邏輯性的語言在迴圈內判斷才能滿足需求。 10/19 17:38
後來改用函數指標的方式寫了 不過這是C# XD
var FuncGetBigImage = DicFuncGetbigImage
.FirstOrDefault(x => domain.Contains(x.Key))
.Value;
//如果有找到dictonary對應的方法 就呼叫它 並加到BigImageList
if (FuncGetBigImage != null)
{
string bigImageUrl = FuncGetBigImage(url);
//必須是圖片才能加到list
if (Regex.IsMatch(bigImageUrl,
@"(?:\w+):\/\/(?<domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*.jpe?g"))
BigImageList.Add(bigImageUrl);
}
/// <summary>
/// 儲存各圖床需要叫用的方法 輸入網址會回傳大圖網址
/// 用法: string newUrl=DicFuncGetbigImage["imgdream"]("your_url");
/// </summary>
Dictionary<string, Func<string, string>> DicFuncGetbigImage =
new Dictionary<string, Func<string, string>>
{
{ "imgdream", Url_deleteThumb },
};
//移除_thumb
private static string Url_deleteThumb(string url)
{
return url.Replace("_thumb", "");
}
※ 編輯: vi000246 (101.9.85.71), 10/19/2016 21:03:17
5F:→ pttworld: 可以過就好,需求是讓程式設計師視覺感覺一次判斷。 10/19 21:08
※ 編輯: vi000246 (49.217.153.116), 10/21/2016 22:24:05