宽度优先是爬虫中使用最为广泛的一种策略,更详细的可以查看宽度优先爬虫。
下午没事干,正好练练python,顺便发本月第一篇blog。。。代码简单实现了抓取网页的中超链接,就是a标签的href,其他像简单的img标签也类似。
#!/usr/bin/python #-*- coding: UTF-8 -*- from bs4 import BeautifulSoup import urllib2 #定义URL队列 class URLQuence: def __init__(self): #已访问的url List self.visted=[] #未访问的url List self.unVisited=[] #添加到未访问List def addUnvisitedUrl(self,url): if url[-1]=="/": url2=url[:-1] else: url2=url+"/" if url not in self.visted and \ url not in self.unVisited and \ url2 not in self.visted and \ url2 not in self.unVisited: #插入头部 self.unVisited.insert(0,url) class MySpider: def __init__(self): self.urlQuence=URLQuence(); def addURL(self,url): self.urlQuence.addUnvisitedUrl(url) #开始抓取 def start(self): while self.urlQuence.unVisited: #url出列 url=self.urlQuence.unVisited.pop() #添加到已访问URL self.urlQuence.visted.append(url) urls=self.getURL(url) #添加到未访问URL for i in urls: self.urlQuence.addUnvisitedUrl(i) print self.urlQuence.unVisited #得到该url下的所有urls def getURL(self,url): urls=[] html=self.getSourceCode(url) if html: soup = BeautifulSoup(html) content=soup.findAll("a") for i in content: url=i["href"] if url and url[0:4]=="http": urls.append(url) return urls #得到源码 def getSourceCode(self,url): try: html=urllib2.urlopen(url).read() except: return None return html if __name__=="__main__": url="http://127.0.0.1" mySpider=MySpider() mySpider.addURL(url) print "start" mySpider.start() print mySpider.urlQuence.visted print "over"
未定义队列的深度,导致爬自己的yilee.info时无法中断。。。
这是第一次爬之后的unvisited列表,列表末尾为第一个进入的。
这是自己随便加的几个测试页面。
期间遇到了BeautifulSoup中文解码问题,老是提醒转码错误,不过后来就没了。。。不懂正则表达式,这个真够麻烦的,代码可能很cuo,不过实现了BFS抓超链接最简单的功能。

BeautifulSoup是个好东西
今天刚看到,Scrapy采用的是深度优先遍历…不过对于定向抓取来看,影响不大
Pingback: 宽度优先爬虫 | 天堂皓月
我的爬虫今天爬交大首页各种错误,还要考虑到相对URL等等的问题
挺麻烦的~~
评论的邮箱提醒没了….