+ -
当前位置:首页 → 问答吧 → 这就是所谓的广度优先网页抓取算法,,,

这就是所谓的广度优先网页抓取算法,,,

时间:2011-01-05

来源:互联网

本帖最后由 SeriousCool 于 2011-01-05 02:08 编辑

从一个页面开始,初始化列表,抓到页面里面所有网址就往列表后面加,再从列表最前面取出一个地址,再抓,添加,再取,再抓,再添加,,,还以为是神马高深的东西,,
  1. #!/usr/bin/python
  2. import urllib2
  3. import re
  4. import time

  5. urlsOld = []
  6. timeStart = time.time()


  7. def getURL(url):
  8.     try:
  9.         fp = urllib2.urlopen(url)
  10.     except:
  11.         print 'get url exception'
  12.         return []

  13.     pattern = re.compile("http://money.163.com/[^\>]+.html")
  14.     while 1:
  15.         s = fp.read()
  16.         if not s:
  17.             break
  18.         urls = pattern.findall(s)
  19.     fp.close()

  20.     if not urls:
  21.         return []
  22.     else:
  23.         return urls

  24. def spider(startURL,times):
  25.     global urlsOld
  26.     urls = []
  27.     urls.append(startURL)
  28.     urlFind = 0
  29.     urlFetched = 0
  30.     while True:

  31.         url = urls.pop(0)

  32.         if urlsOld.count(url) == 0:
  33.             urlsOld.append(url)
  34.             print 'fetch url: ', url
  35.             urlFetched += 1
  36.         else:
  37.             print 'already fetched!'
  38.             continue

  39.         urlList = getURL(url)
  40.         for url in urlList:
  41.             if ( urls.count(url) == 0 and urlsOld.count(url) == 0 ):
  42.                 urls.append(url)
  43.                 print 'find url: ', url
  44.                 urlFind += 1
  45.             else:
  46.                 print 'url exists: ', url
  47.         seconds = time.time() - timeStart
  48.         print 'urls: ', len(urls), '; urlFind: ', urlFind, '; urlFetched: ', urlFetched, '; time spent: ', int(seconds), ' seconds'

  49. spider('http://www.163.com',1000)
复制代码

作者: SeriousCool   发布时间: 2011-01-05

明天再给加上多线程,跑上一天,看看能抓多少,

作者: SeriousCool   发布时间: 2011-01-05