python核心编程中网络爬虫的例子
#!/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核心编程中网络爬虫的例子的更多相关文章
- python核心编程中的对象值比较VS对象身份比较(转载)
转载地址: https://blog.csdn.net/Mluka/article/details/51076786 在python核心编程第四章中,P69在优化下面这段代码时提出了:对象值比较VS对 ...
- Python核心编程(网络编程)
1.python socket模块内置方法 2.tcp服务器伪代码 3.tcp客户端伪代码 4.socket模块属性 5.一个简单的tcp客户端和服务端 服务端代码: # encoding:utf-8 ...
- Python核心编程-描述符
python中,什么描述符.描述符就是实现了"__get__"."__set__"或"__delete__" 方法中至少一个的对象.什么是非 ...
- python核心编程第二版笔记
python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d 提供调试输出1.2 –O 生成优化的字节码(生成 ...
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
- Python核心编程第二版(中文).pdf 目录整理
python核心编程目录 Chapter1:欢迎来到python世界!-页码:7 1.1什么是python 1.2起源 :罗萨姆1989底创建python 1.3特点 1.3.1高级 1.3.2面向 ...
- Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器
生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程 ...
- python核心编程--笔记(不定时跟新)(转)
的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v ...
- python核心编程笔记(转)
解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找python路径 1.4 –v 冗 ...
随机推荐
- Python异常基础
一.常见异常及场景举例 1.AssertionError 断言失败,断言是调试中常用(表示自己并不常用┑( ̄Д  ̄)┍)手段 举例: def foo(s): n = int(s) assert n ! ...
- idea中使用restclient测试接口发送http请求
转载:https://jingyan.baidu.com/article/ca41422f0bfd8e1eae99ed31.html
- 《The Python Standard Library》——http模块阅读笔记1
官方文档:https://docs.python.org/3.5/library/http.html 偷个懒,截图如下: 即,http客户端编程一般用urllib.request库(主要用于“在这复杂 ...
- 使用jxl读取excel内容,并转换成Json,用于Datagrid
一.上传excel文件,得到InputStream,由InputStream得到Jxl中的Workbook,取出内容,存到二维数组中. 1.使用 Jquery Uploadify 插件(http:// ...
- unity摄像机移动滑动
之前写了一个pc版本的 // 当按住鼠标左键的时候 //if (Input.GetMouseButton(0)) //{ // // 获取鼠标的x和y的值,乘以速度和Time.deltaTime是因为 ...
- 深入redis内部之redis启动过程之一
redis作为一个服务器,它的启动是从main函数开始的.redis.c 1. 进程重命名 #ifdef INIT_SETPROCTITLE_REPLACEMENT spt_init(argc, ar ...
- js经验点滴js apply/call/caller/callee/bind使用方法与区别分析
一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). Js代码 call([thisObj[,arg1[, arg2[, ...
- pythion的定义函数和传递实参
1.定义函数 例子: def greet_user(): """显示简单的问候语""" print("Hello!")g ...
- springboot 整合kafka
本文介绍如何在springboot项目中集成kafka收发message. 1.先解决依赖 springboot相关的依赖我们就不提了,和kafka相关的只依赖一个spring-kafka集成包 &l ...
- dataBinding与ListView及事件
2015年Google IO大会分布了DataBinding库,能够更快捷便利的实现MVVM结构模式.但是,通过对DataBinding的学习,其中踩过得坑,今天要在这里记录一下.对于DataBind ...