在Python中检查重复url的最佳方法是什么?

2024-05-16 03:21:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在想一个最好的方法,如何检查两个或更多的网址重复的情况下,他们有一些额外的参数,如下面的代码。在fac中,url1和url2是相同的,但是当运行webspider时,它将被视为两个单独的url,并且结果将被复制。在

from urllib2 import urlopen
import hashlib

url1 = urlopen('http://www.time.com/time/nation/article/0,8599,2109975,00.html?xid=gonewssedit')
u1 = hashlib.md5(u1).hexdigest() 
url2 = urlopen('http://www.time.com/time/nation/article/0,8599,2109975,00.html')
u2 = hashlib.md5(u2).hexdigest() 
if u1 == u2:
    print 'yes'
else:
    print 'no'

简而言之,我将使用url头生成md5散列,然后将其存储在数据库中,然后当我抓取新的url时,我可以检查它是否重复。但我不确定这是在Python中完成这项工作的最佳方法。在

非常感谢


Tags: 方法importcomhttpurltimewwwmd5
3条回答

也许可以这样试试?在

from urlparse import urlparse 

websites = set()

def is_unique(website):
    # Strip of the last bit
    parsed = urlparse(website)
    url = parsed.hostname + parsed.path
    if url in websites:
        return False
    websites.add(url)
    return True

如果不检索两个uri,就无法知道两个uri是否指向同一个资源。而且,即使它们基本上是相同的内容,它们也可能具有动态元素(如广告),这些元素随每个请求而变化,因此很难通过编程方式检测这两个uri是否相同。在

网页的结果可能相同或不同,这取决于“额外参数”。因此,一般来说,不能定义只通过查看url来检测重复内容的规则。在

我建议将url1和url2视为不一样。计算一下从URL接收到的每一块(比如1024个单词)的MD5和。维护这些md5sum的哈希映射,以便能够检测重复项。在

可能一些web crawling tools可能提供了一些您需要的特性。在


更新基于OP的评论:我写了一些代码来增强我的回答。有两种版本:第一种更简单:

def find_matches():
    """
        Basic version: reads urls, but does not consider the semantic information of
        HTML header, body, etc. while computing duplicates.
    """

    from urllib2 import urlopen
    import hashlib

    urls = [ 'http://www.google.com', 'http://www.google.com/search']

    d = {}
    url_contents = {}
    matches = []
    for url in urls:
        c = urlopen(url)
        url_contents[url] = []
        while 1:
            r = c.read(4096)
            if not r: break
            md5 = hashlib.md5(r).hexdigest()
            url_contents[url].append(md5)
            if md5 in d:
                url2 = d[md5]
                matches.append((md5, url, url2))
            else:
                d[md5] = []
            d[md5].append(url)
    #print url_contents
    print matches

if __name__ == '__main__':
    find_matches()

期望上面的代码以预期的方式检测重复项是天真的:当前的网页太复杂了。因此,即使是用户眼中相同的两个url,由于广告、散列标签、自url名称包含等原因,实际上也存在许多差异

第二个版本更复杂。它基于beauthulsoup对内容进行了有限的语义分析:

^{pr2}$

然而,第二个版本也不起作用。原因依旧。实际上,两个url的头文本之间的差异是包含的哈希值,而两个url的正文文本之间的差异是一个字符串webhp。我用过difflib.context_diff来计算差额。在

可以增强代码以包含第三个版本,该版本更智能地解析web页面并更智能地计算diff。例如,即使是具有5%diff的文本也声明为重复(使用difflib函数可以很容易地计算出这个比率)。在

相关问题 更多 >