预测网站是否返回相同的内容

时间:2014-08-12 23:19:23

标签: python url web-crawler urllib2

我正在编写一个Web爬虫,但是我的函数有问题,递归调用链接。 假设我有一个页面: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 给出与上一个链接相同的页面。 我有一个无限循环。

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

2 个答案:

答案 0 :(得分:1)

您可以存储之前看过的网页内容的哈希值,并在继续之前检查该页面是否已被显示。

答案 1 :(得分:1)

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

您可以使用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解析器并不重要。重要的是,您解析链接并获取要检查的路径。