[問題] 爬蟲正規表達式的效能

看板java作者 (Vi)時間8年前 (2016/10/19 09:55), 8年前編輯推噓0(005)
留言5則, 2人參與, 最新討論串1/1
我寫了一支爬蟲用來爬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
一次建立html的tag組對,非圖的也有其他處理需要使用。
10/19 13:57, 1F

10/19 14:05, , 2F
我目前是把會出現網址的DIV區塊濾出來判斷有沒有網址 再
10/19 14:05, 2F

10/19 14:05, , 3F
一個一個判斷網址的HOST
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
文章代碼(AID): #1O1jA9lr (java)
文章代碼(AID): #1O1jA9lr (java)