- Python code
#!python # encoding: gbk from urllib import urlopen import re import urllib import urlparse import HTMLParser def catchUrl(url): #获取源文件 sourceFile = urlopen(url).read() #正则过滤 rUrl = re.compile(r'href=\"([^^]*?)\".') webUrl = rUrl.findall(sourceFile) #提出URL后判断输出 for i in webUrl: if i.startswith("/"): print i if len(i) != 0: catchUrl(url+i) url = raw_input("请输入需要检测的URL:") catchUrl(url)
这个是我自己写的代码,大概就是获取页面源文件,然后正则过滤出该网站的URL。然后递归调用从过滤出的URL中再获取源文件然后继续递归调用。类似于给你一个页面然后1个页面爬出N个页面,N个页面爬出N*N个页面。现在遇到的情况就是,我递归爬行中有很多重复的URL,然后这些重复的URL也被继续递归下去,然后就构成死循环。开始是想把URL保存到数组里面,每次递归的时候判断数组中是否有重复。但是我自己写这段话的时候老是出错,在线各位高手帮帮忙。
------解决方案--------------------
我开始觉得用全局变量来保存url好像不太好,但是刚才搜索了个例子,看到别人也是用保存到全局变量的方法来判断是否重复的。我只是大概看了下那个例子,没有很仔细看。好像是用集合操作来去除重复的url
你可以看看:
http://sanss.me/blog/10
------解决方案--------------------
出错的代码也要贴出来,另外贴python代码缩进要弄对,否则意思全乱了。
可以再给catchUrl加一个参数processedURL,记录下载过的url。
- Python code
def catchURL(url, processedURL): # 从url获取文件 ... processedURL.add(url) #当前url已经下载过了,记录在processedURL中 # 提取url URLList = ... # 处理这些url for nextURL in URLList: if nextURL not in processedURL: catchURL(nextURL, processedURL) # 这样调用 catchURL(firstURL, set())
------解决方案--------------------
# encoding: utf-8
...
from Storage import storage
# 参考 http://blog.csdn.net/tim_spac/article/details/7006142
def getUrlContent(url):
content = storage[url] or webRetrieve(url)
if content:
return [lnk for lnk in parserHref(content) if lnk not in storeage.keys()]
...
------解决方案--------------------
list(set(a)),可以得到a的无重复元素列表