#!/usr/bin/env python

 import cStringIO                    #
import formatter #
from htmllib import HTMLParser # We use various classes in these modules for parsing HTML.
import httplib # We only need an exception from this module
import os # This provides various file system functions
import sys # We are just using argv for command-line arguments
import urllib # We only need the urlretrieve()function for downloading Web pages
import urlparse # We use the urlparse()and urljoin()functions for URL manipulation class Retriever(object):
__slots__ = ('url','file') def __init__(self,url):
self.url, self.file = self.get_file(url) def get_file(self, url, default='index.html'):
'Create usable local filename from URL'
parsed = urlparse.urlparse(url) # ParseResult(scheme='http', netloc='www.baidu.com', path='', params='', query='', fragment='')
host = parsed.netloc.split('@')[-1].split(':')[0] # 'www.baidu.com'
filepath = '%s%s' % (host,parsed.path) # 'www.baidu.com'
if not os.path.splitext(parsed.path)[1]: # ''
filepath = os.path.join(filepath, default) # 'www.baidu.com\\index.html'
linkdir = os.path.dirname(filepath) # 'www.baidu.com'
if not os.path.isdir(linkdir): # False
if os.path.exists(linkdir): # False
os.unlink(linkdir)
os.makedirs(linkdir) # make a directory named by link directory on the hard disc
return url, filepath def download(self):
'Download URL to specific name file'
try:
retval = urllib.urlretrieve(self.url, self.file)
except (IOError, httplib.InvalidURL) as e:
retval = (('*** ERROR:bad URL "%s": %s' % (self.url,e)),)
return retval def parse_links(self):
'Parse out the links found in downloaded HTML file'
f = open(self.file, 'r')
data = f.read()
f.close()
parser = HTMLParser(formatter.AbstractFormatter(formatter.DumbWriter(cStringIO.StringIO())))
parser.feed(data)
parser.close()
return parser.anchorlist class Crawler(object):
count = 0 # the number of objects downloaded from the internet def __init__(self, url):
self.q = [url] # a queue of links to download
self.seen = set() # a set containing all the links that we have seen(downloaded) already
parsed = urlparse.urlparse(url)
host = parsed.netloc.split('@')[-1].split(':')[0]
self.dom = '.'.join(host.split('.')[-2:]) # 'b.a.i.d.u' def get_page(self, url, media=False):
'Download page & parse links, add to queue if nec'
r = Retriever(url)
fname = r.download()[0] # 'www.baidu.com\\index.html'
if fname[0] == '*': # 'w'
print fname, '... skipping parse'
return
Crawler.count += 1 #
print '\n(', Crawler.count, ')' # (1)
print 'URL:', url # URL: http://www.baidu.com
print 'FILE:', fname # FILE: www.baidu.com\\index.html
self.seen.add(url) # set(['http://www.baidu.com'])
ftype = os.path.splitext(fname)[1] # '.html'
if ftype not in ('.htm', '.html'): # False
return for link in r.parse_links():
if link.startswith('mailto:'): # False
print '... discarded, mailto link'
continue
if not media: # False
ftype = os.path.splitext(link)[1]
if ftype in ('.mp3','.mp4','.m4v','.wav'):
print '... discarded, media file'
continue
if not link.startswith('http://'): # False
link = urlparse.urljoin(url, link)
print '*', link,
if link not in self.seen: # True
if self.dom not in link: # False
print '... discarded, not in domain'
else:
if link not in self.q:
self.q.append(link)
print '... new, added to Q'
else:
print '... discarded, already in Q'
else:
print '... discarded, already processed' def go(self, media=False):
'Process next page in queue (if any)'
while self.q:
url = self.q.pop()
self.get_page(url, media) def main():
if len(sys.argv) > 1:
url = sys.argv[1]
else:
try:
url = raw_input('Enter starting URL:')
except(KeyboardInterrupt, EOFError):
url = ''
if not url:
return
if not url.startswith('http://') and not url.startswith('ftp://'):
url = 'http://%s/' % url
robot = Crawler(url)
robot.go() if __name__ == '__main__':
main()

python核心编程中网络爬虫的例子的更多相关文章

  1. python核心编程中的对象值比较VS对象身份比较(转载)

    转载地址: https://blog.csdn.net/Mluka/article/details/51076786 在python核心编程第四章中,P69在优化下面这段代码时提出了:对象值比较VS对 ...

  2. Python核心编程(网络编程)

    1.python socket模块内置方法 2.tcp服务器伪代码 3.tcp客户端伪代码 4.socket模块属性 5.一个简单的tcp客户端和服务端 服务端代码: # encoding:utf-8 ...

  3. Python核心编程-描述符

    python中,什么描述符.描述符就是实现了"__get__"."__set__"或"__delete__" 方法中至少一个的对象.什么是非 ...

  4. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  5. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

  6. Python核心编程第二版(中文).pdf 目录整理

    python核心编程目录 Chapter1:欢迎来到python世界!-页码:7 1.1什么是python 1.2起源  :罗萨姆1989底创建python 1.3特点 1.3.1高级 1.3.2面向 ...

  7. Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

      生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程 ...

  8. python核心编程--笔记(不定时跟新)(转)

    的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   ...

  9. python核心编程笔记(转)

    解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗 ...

随机推荐

  1. hdu1702 ACboy needs your help again!(栈处理)

    ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  2. $bzoj1009-HNOI2008$ $GT$考试 字符串$dp$ 矩阵快速幂

    题面描述 阿申准备报名参加\(GT\)考试,准考证号为\(N\)位数\(x_1,x_2,...,x_n\ (0\leq x_i\leq 9)\),他不希望准考证号上出现不吉利的数字. 他的不吉利数字\ ...

  3. web服务器架构演化及所其技术知识体系(分布式的由来)

    文章标题是我自己取的,内容来着百度百科k5665219的一篇回答,觉得讲的很不错就转载过来了. 最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们 ...

  4. oracle 错误实例分析(ORA-01078)

    01,问题描述 心血来潮想看一下启动数据库的alert log.然后把数据库给关闭了,同时也在监听日志文件    下面可谓是详细的描述了整个关机过程,也看到了无数的error [root@node1 ...

  5. dockerfile 语法

    基本语法格式:INSTRUCTION arguments (指令+参数)不分大小写 注释格式:# 注释 第一个指令必须是FROM,标示使用什么镜像 1.解析器指令 解析器指令是可选的,并且影响处理Do ...

  6. mysql多表条件更新

    有两张表bas_student.bas_householder, 去除学生表中与家长表重复的手机号 UPDATE bas_student a,bas_householder b SET a.mobil ...

  7. javascript获取后台传来的json

    Mvc Razor视图引擎中 <script type="text/javascript"> var _temp = @(new MvcHtmlString(this. ...

  8. Spring Chapter4 WebSocket 胡乱翻译 (二)

    书接上文,Spring Chapter4 WebSocket 胡乱翻译 (一) 4.4.4. 消息流 一旦暴露了STOMP端点,Spring应用程序就成为连接客户端的STOMP代理. 本节介绍服务器端 ...

  9. 【学习笔记】Java中生成对象的5中方法

    概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...

  10. 字符串(1)——Detect Capital

    Given a word, you need to judge whether the usage of capitals in it is right or not. We define the u ...