【问题标题】:Predict if sites returns the same content预测网站是否返回相同的内容
【发布时间】:2014-10-06 04:37:23
【问题描述】:

我正在编写一个网络爬虫,但是递归调用链接的函数有问题。 假设我有一个页面:http://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind。 我正在寻找所有链接,然后递归打开每个链接,再次下载所有链接等。 问题是,一些链接虽然有不同的urls,但会驱动到同一页面,例如: http://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind#mw-navigation 给出与上一个链接相同的页面。 我有一个无限循环。

是否有可能在不比较该页面的所有内容的情况下检查两个链接是否驱动到同一页面?

【问题讨论】:

标签: python url web-crawler urllib2


【解决方案1】:

您可以存储之前浏览过的页面内容的哈希值,并在继续之前检查该页面是否已经浏览过。

【讨论】:

    【解决方案2】:

    无需对同一页面发出额外的请求。

    您可以使用urlparse() 并检查基本网址的.path 部分是否与您抓取的链接相同:

    from urllib2 import urlopen
    from urlparse import urljoin, urlparse
    from bs4 import BeautifulSoup
    
    url = "http://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind"
    base_url = urlparse(url)
    
    soup = BeautifulSoup(urlopen(url))
    for link in soup.find_all('a'):
        if 'href' in link.attrs:
            url = urljoin(url, link['href'])
            print url, urlparse(url).path == base_url.path
    

    打印:

    http://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind#mw-navigation True
    http://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind#p-search True
    http://en.wikipedia.org/wiki/File:Set_partitions_4;_Hasse;_circles.svg False
    ...
    http://en.wikipedia.org/wiki/Equivalence_relation False
    ...
    http://en.wikipedia.org/wiki/Stirling_numbers_of_the_second_kind True
    ...
    https://www.mediawiki.org/ False
    

    这个特定的示例使用BeautifulSoup 来解析维基百科页面并获取所有链接,但这里的实际 html 解析器并不重要。重要的是您解析链接并获取要检查的路径。

    【讨论】:

    • 谢谢,这真的很有帮助,因为我在我的程序中同时使用:urlparser 和 BeautifulSoup
    猜你喜欢
    • 2020-01-09
    • 2013-05-09
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    相关资源
    最近更新 更多