作者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/cn.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