项目组要得到这个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()函数判断一下,然后再进行下载,完成任务。呵呵
分享到:
相关推荐
python3.6.3递归爬取国家统计局地区数据存入mysql,可以自定义爬取省市区县乡镇社区5级 数据来源:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/index.html get_level爬取到哪一级的数据 1省,2市,3区县...
python3.6.3递归爬取国家统计局地区数据存入mysql,可以自定义爬取省市区县乡镇社区5级 数据来源:http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/index.html get_level爬取到哪一级的数据 1省,2市,3区县...
主要介绍了Python基于递归算法实现的走迷宫问题,结合迷宫问题简单分析了Python递归算法的定义与使用技巧,需要的朋友可以参考下
本文实例讲述了python递归计算N!的方法。分享给大家供大家参考。具体实现方法如下: def factorial(n): if n == 0: return 1 else: return n * factorial(n - 1) 希望本文所述对大家的Python程序设计有所帮助...
主要介绍了Python基于递归和非递归算法求两个数最大公约数、最小公倍数,涉及Python递归算法、流程循环控制进行数值运算相关操作技巧,需要的朋友可以参考下
本篇文章主要介绍了python使用递归、尾递归、循环三种方式实现斐波那契数列,非常具有实用价值,需要的朋友可以参考下
手动输入一个字符串,Python用递归实现字符串反转
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续...然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
使用环境:需要先安装PyCharm(请自己百度下载安装),以及然后官网上下载Python 2.7版本,以及Python 3.7版本后,安装在自己的电脑上。 使用步骤: ...目的:帮助理解递归函数在Python中的具体使用。
此程序是爬虫实例
(3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低,所以一般不提倡用递归算法设计程序。 (4)在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储,递归次数过多容易造成栈溢出等。
python 递归算法 Python递归算法是一种非常重要的算法,它可以解决许多复杂的问题。递归算法是一种自我调用的算法,它通过将问题分解成更小的子问题来解决问题。在Python中,递归算法可以使用函数来实现。 递归算法...
Python 递归函数 如果一个函数体直接或者间接调用自己,那么这个函数就称为递归函数.也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要...
主要介绍了python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形) ,需要的朋友可以参考下
Python 使用递归斐波那契数列
python非递归方式计算阶乘(循环)
使用递归函数需要注意防止栈溢出。 在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。 由于栈的大小不是无限的,所以,递归...
# 题目: # 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
编写递归算法,计算二叉树中叶子结点的数目
python文件递归拷贝