[問題] 爬蟲正規表達式的效能
我寫了一支爬蟲用來爬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://www.ptt.cc/bbs/java/M.1476842121.A.BF5.html
→
10/19 13:57, , 1F
10/19 13:57, 1F
→
10/19 14:05, , 2F
10/19 14:05, 2F
→
10/19 14:05, , 3F
10/19 14:05, 3F
→
10/19 17:38, , 4F
10/19 17:38, 4F
後來改用函數指標的方式寫了 不過這是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
→
10/19 21:08, , 5F
10/19 21:08, 5F
※ 編輯: vi000246 (49.217.153.116), 10/21/2016 22:24:05
java 近期熱門文章
PTT數位生活區 即時熱門文章
14
23