pythonネットワーク爬虫類(二)BFSは絶えずURLをつかんでファイルに入れます
1511 ワード
前編のpythonネットワーク爬虫類(一)単純demoはまだ爬虫類とは呼べないが、リンクを自動化する機能がないため、基礎と言えるだろう.
本編では、以下の機能を追加します.
【1】キューが空になるまでURLを優先的に検索
【2】すべてのURLをファイルに書き込む
【3】アクセス不可またはエラーアクセスのURLについてはtry except処理がある
spider.py
本編では、以下の機能を追加します.
【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()