pythonネットワーク爬虫類(二)BFSは絶えずURLをつかんでファイルに入れます

1511 ワード

前編のpythonネットワーク爬虫類(一)単純demoはまだ爬虫類とは呼べないが、リンクを自動化する機能がないため、基礎と言えるだろう.
本編では、以下の機能を追加します.
【1】キューが空になるまでURLを優先的に検索
【2】すべてのURLをファイルに書き込む
【3】アクセス不可またはエラーアクセスのURLについてはtry except処理がある
spider.py
# -*- coding: cp936 -*-
import urllib,Queue,sgmllib,re,os

class URLList(sgmllib.SGMLParser):
    def reset(self):
        sgmllib.SGMLParser.reset(self)
        #maxsize < 1       
        self.URLqueue = Queue.Queue(maxsize = -1)
    def start_a(self,attrs):
        href = [v for k,v in attrs if k == 'href']
        if href:
            for u in href:
                #  URL      ,href    "http://"
                pat = re.compile(r'http://(.+?)')
                #False,0,'',[],{},()      ,    len()==0      
                if len(re.findall(pat,u)) == 0:
                    continue
                
                self.URLqueue.put(u)
                
def getURLList(url,parser):
    try:
        URLdata = urllib.urlopen(url)
        parser.feed(URLdata.read())
        URLdata.close()
    except:
        return 

startURL = "http://www.baidu.com"
parser = URLList()
getURLList(startURL,parser)

outfile = startURL[7:len(startURL)]+".txt"
out = open(outfile,'w+')


try:
    #BFS
    while parser.URLqueue.empty() == False:
        url = parser.URLqueue.get()
        print url
        out.writelines(url+'
') getURLList(url,parser) finally: parser.close() out.close()