【问题标题】:Using python and re.findall, I'm trying to count the number of valid domain hits in an apache log使用 python 和 re.findall,我试图计算 apache 日志中有效域命中的数量
【发布时间】:2014-01-24 19:30:28
【问题描述】:

这是我的日志文件中“有效”行的示例: 194.81.31.125 - - [129/Dec/2013:22:03:09 -0500] "GET http://www.firemaiden.hu/cgi-bin/top/topsites.cgi?an12 HTTP/1.0" 200 558 "http://Afrique" "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)"

我有这个 re.findall 表达式:(GET|POST)\s(http://|https//)[a-zA-Z]+.+?"\s200 此表达式包含有效行的所有规则,但不提取域。

我想计算每个日期的顶级域,在本例中为“hu”,并将每个域的计数转储到一个有组织的日志文件中。我还想将无效行提取到不同的日志文件中

理想的输出是:

12/Dec/2013[tab]as:1[tab]ab:2[tab]hu:4

13/Dec/2013[tab]as:4[tab]br:7[tab]cd:8

【问题讨论】:

    标签: python regex apache findall logfile


    【解决方案1】:

    当然它不会提取域;您没有通过将其括在括号中将其放入捕获组中。

    所以,首先要做的是添加括号:

    r'(GET|POST)\s(http://|https//)([a-zA-Z]+.+?)"\s200'
    

    但这仍然不对,因为它将捕获整个www.firemaiden.hu/cgi-bin/top/topsites.cgi?an12 HTTP/1.0,而不仅仅是www.firemaiden.hu。那是因为你只有一组字母,后面跟着任何东西,直到引用。您只需要字母和点(这对于 DNS 实际上并不正确,但我们暂时忽略它)。像这样:

    r'(GET|POST)\s(http://|https//)([a-zA-Z\.]+).+?"\s200'
    

    现在你得到www.firemaiden.hu

    但你只想要.hu,对吧?所以,你真正需要的是尽可能多的字母和点,直到一个点之后的一组字母:

    r'(GET|POST)\s(http://|https//)[a-zA-Z\.]+\.([a-zA-Z]+).+?"\s200'
    

    但是,您需要阅读有关 DNS 名称的规则——理论上,这些规则实际上取决于每个根服务器。但是标准世界根下的任何内容都遵循 LDH 规则:字母、数字、连字符。所以,你想要[a-zA-Z0-9-\.],对吧?

    但许多服务器也会接受下划线并将其视​​为连字符,并且一些服务器会将 IDNA (punycode) 名称解码为 Unicode 以进行日志记录,因此即使这样也可能不正确。

    话虽如此,我认为,与其使用您不知道如何编写并且可能无法理解的正则表达式,不如使用更简单的正则表达式来获取 URL(您已经知道该怎么做) ,然后使用专用的 URL 解析器进行破解:

    r'(GET|POST)\s(\S+)\s.*?200'
    

    然后:

    p = urllib.parse.urlparse(match[1])
    

    现在p.scheme 是您的'http''https'p.netloc'www.firemaiden.hu'(您可以轻松调用.split('.')[-1])等等。

    【讨论】:

    • 感谢您提供的信息...我很好奇如何解决域服务器位于仅一个 '.' 之后的情况。例如:http://firemaiden.com
    • @kegewe:“如何解决这种情况”是什么意思?你试过我的任何例子吗?他们两个都给你com那个URL。这不是你想要的吗?
    • 抱歉,我没有使用 urllib,而是尝试了您对正则表达式的第一次建议修改,我能够将域作为元组输出的第三个元素。现在我只需要组织输出。
    • @kegewe:哪一个?如答案中所述,前两个根本不起作用。第三个适用于www.firemaiden.hu,也适用于firemaiden.com。那么,你有什么问题呢?
    • 似乎第三个也返回了一些不是顶级域的值。例如,它在地址 www.southern-charms.com 中返回一个类似“southern”的词
    猜你喜欢
    • 2015-02-09
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多