用python编写递归爬取多重网址的网站信息

项目组要得到这个http://kalug.linux.org.tw/~shawn/project/thesis/目录网址下面的所有文件以及这个文件目录的下层目录以及更下层目录的文件包括这个,用迅雷,flashget好像都没这样的功能:找到给一个链接,然后再递归爬取这个链接下的所有链接的。
于是自己写了一个,好像还行o(∩_∩)o...呵呵 下面是代码,这里主要爬取pdf与doc文件。


# -*- coding: utf-8 -*-
import urlparse,urllib,re,os
"""
this class is mainly used to crawl the deep url in the urls
do this work for 242
"""
class SpiderMulti:

def read(self,url):
urlli=self.analy(url)
urldic = {}
cutli=urlli[1:]
for x in cutli:
urldic.update(x)
for url in [x.keys()[0] for x in cutli]:
if self.islink(url,urldic):
print url
self.read(url)
else:
self.download(url,urldic)


def analy(self,url):
urlli=[]
try:
html=urllib.urlopen(url).read().split('\n')
orignalUrl = url #re.search(r'<h2>(.*?)</h2>',url,re.I|re.DOTALL)
for eachline in html:
#print eachline
currentFind = re.search(r'href="(.*?)"',eachline,re.IGNORECASE|re.DOTALL)
if currentFind:
urldic = {}
curUrl = urlparse.urljoin(orignalUrl,currentFind.group(1))
dirFind = re.search(r'class="t".*?>(.*?)<',eachline,re.IGNORECASE|re.DOTALL)
curDir = dirFind.group(1)
urldic[curUrl]=curDir
urlli.append(urldic)
except:
print 'can not open ',url
pass

#print urlli
return urlli

def islink(self,url,urldic):
if urldic[url] == 'Directory':
return True
else:
return False

def download(self,url,urldic):
print '=====:',url,urldic[url]
if (self.isfile(url)):
name = os.path.join(r'd:\data',url.split('/')[-1])
print 'dowm:',url,name
try:
f=urllib.urlretrieve(url,name)
except:
print 'can not writtofile'
pass

def isfile(self,url):
if re.search(r'doc$|pdf$',url,re.IGNORECASE|re.DOTALL):
return True
else:
return False



if __name__=='__main__':
t=SpiderMulti()
url='http://kalug.linux.org.tw/~shawn/project/thesis/'
t.read(url)


解释一下:
1、主函数是read(),在这里面实现递归。

2、analy(url)函数分析传入的url,提取出该页的url链接,当然如果你要用你自己的url这里需要改变的是正则表达式的匹配规则。返回一个列表,列表的元素是字典,key是当前的链接地址,值是该地址对应的类型(这里主要是针对该类网站这样设计的,大家可以打开看看网页
的结果)。

3、islink()函数是判断输入的url是不是目录,如果是则递归执行read()函数

4、download()函数是:输入的链接对应的是个文件,但是不一定是我们想要的pdg或者doc文件,所以先用isfile()函数判断一下,然后再进行下载,完成任务。呵呵
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值