摘自:http://blog.csdn.net/killua_hzl/article/details/5789620

所谓的网络爬虫就是利用程序抓取想要的网页或者数据。

下面对程序中所使用模块进行简单分析:

网络方面涉及Python的三个模块htmllib,urllib,urlparse。

1)htmllib这个模块定义了一个可以担当在超文本标记语言(HTML)中解析文本格式文件的基类。该类不直接与I/O有关--它必须被提供字符串格式的输入,并且调用一个“格式设置”对象的方法来产生输出。该HTMLParser类被设计用来作为其他类增加功能性的基类,并且允许它的多数方法被扩展或者重载。该HTMLParser实现支持HTML 2.0(描述在RFC1866中)语言。

2)urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据。通过简单的函数调用,URL所定位的资源就可以被你作为输入使用到你的程序中。如果再配以re(正则表达式)模块,那么你就能够下载Web页面、提取信息、自动创建你所寻找的东西。urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);

3)urlparse模块使我们能够轻松地把URL分解成元件(urlparse),之后,还能将这些元件重新组装成一个URL(urljoin)。当我们处理HTML 文档的时候,这项功能是非常方便的。

系统方面涉及Python的模块比较简单,主要是常用的sysos两个模块。主要用于文件夹的创建,文件路径的定位和判断等常用功能。这里不再介绍深入介绍。

输入输出方面使用了cStringIO模块。StringIO的行为与file对象非常像,但它不是针对磁盘上文件,而是一个内存中的“文件”,我们可以将操作磁盘文件那样来操作StringIO。

formatter模块主要用于格式化输出。这里的格式化输出不仅仅是“格式化”输出而已。它可以将 HTML 解析器的标签和数据流转换为适合输出设备的事件流( event stream ),从 而 写将事件流相应的输出到设备上。

这个程序所使用的Python解释器版本为2.6.5

下面是代码部分

NetCrawl.py

view plaincopy to clipboardprint?
  1. #!/usr/bin/env python
  2. #网络爬虫程序
  3. from sys import argv
  4. from os import makedirs, unlink, sep
  5. from os.path import dirname, exists, isdir, splitext
  6. from string import replace, find, lower
  7. from htmllib import HTMLParser
  8. from urllib import urlretrieve
  9. from urlparse import urlparse, urljoin
  10. from formatter import DumbWriter, AbstractFormatter
  11. from cStringIO import StringIO
  12. class Downloader(object) :
  13. #构造器
  14. def __init__(self, url) :
  15. self.url = url
  16. self.file = self.filename(url)
  17. #分析获取文件名
  18. def filename(self, url, defFile = 'index.htm') :
  19. parsedUrl = urlparse(url, 'http:', 0)
  20. path = parsedUrl[1] + parsedUrl[2]
  21. ext = splitext(path)
  22. if ext[1] == '':        #使用默认文件名
  23. if path[-1] == '/':
  24. path += defFile
  25. else:
  26. path += '/' + defFile
  27. localDir = dirname(path)
  28. if sep != '/':
  29. localDir = replace(localDir, '/', sep)
  30. if not isdir(localDir):
  31. if exists(localDir):     #文件存在删除
  32. unlink(localDir)
  33. makedirs(localDir)
  34. return path
  35. #下载页面
  36. def download(self) :
  37. try :
  38. retval = urlretrieve(self.url, self.file)
  39. except IOError:
  40. retval = ('***ERROR: invalid URL "%s"' % self.url)
  41. return retval
  42. #分析保存链接
  43. def parseAndGetLinks(self) :
  44. self.parser = HTMLParser(AbstractFormatter( /
  45. DumbWriter(StringIO())))
  46. self.parser.feed(open(self.file).read())
  47. self.parser.close()
  48. return self.parser.anchorlist
  49. class NetCrawler(object):
  50. count = 0  #计数器
  51. #构造器
  52. def __init__(self, url) :
  53. self.queue = [url]
  54. self.seen = []
  55. self.dom = urlparse(url)[1]
  56. #获取页面
  57. def getPage(self, url) :
  58. dl = Downloader(url)
  59. retval = dl.download()
  60. if retval[0] == '*' :
  61. print retval, '...skipping parse'
  62. return
  63. NetCrawler.count += 1
  64. print '/n(', NetCrawler.count, ')'
  65. print 'Url: ', url
  66. print 'File: ', retval[0]
  67. self.seen.append(url)
  68. links = dl.parseAndGetLinks()
  69. for eachLink in links :
  70. if eachLink[ : 4] != 'http' and /
  71. find(eachLink, '://') == -1:
  72. eachLink = urljoin(url, eachLink)
  73. print '*',eachLink
  74. if find(lower(eachLink), 'mailto:') != -1:
  75. print '... discarded, mailto link'
  76. continue
  77. if eachLink not in self.seen:
  78. if find(eachLink, self.dom) == -1 :
  79. print '... discarded, not in domain'
  80. else :
  81. if eachLink not in self.queue :
  82. self.queue.append(eachLink)
  83. print '... new, added to queue'
  84. else :
  85. print '... dirscarded, already in queue'
  86. else :
  87. print '... discarded, already processed'
  88. #处理队列中的链接
  89. def run(self) :
  90. while self.queue :
  91. url = self.queue.pop()
  92. self.getPage(url)
  93. #主函数
  94. def main() :
  95. #url = 'http://www.hao123.com/haoserver/index.htm'
  96. if len(argv) > 1 :
  97. url = argv[1]
  98. else :
  99. try :
  100. url = raw_input('Enter starting URL: ')
  101. expect (KeyboardInterrupt, EOFError) :
  102. url = ''
  103. if not url :
  104. return
  105. netCrawler = NetCrawler(url)
  106. netCrawler.run()
  107. if __name__ == '__main__' :
  108. main()

#!/usr/bin/env python #网络爬虫程序 from sys import argv from os import makedirs, unlink, sep from os.path import dirname, exists, isdir, splitext from string import replace, find, lower from htmllib import HTMLParser from urllib import urlretrieve from urlparse import urlparse, urljoin from formatter import DumbWriter, AbstractFormatter from cStringIO import StringIO class Downloader(object) : #构造器 def __init__(self, url) : self.url = url self.file = self.filename(url) #分析获取文件名 def filename(self, url, defFile = 'index.htm') : parsedUrl = urlparse(url, 'http:', 0) path = parsedUrl[1] + parsedUrl[2] ext = splitext(path) if ext[1] == '': #使用默认文件名 if path[-1] == '/': path += defFile else: path += '/' + defFile localDir = dirname(path) if sep != '/': localDir = replace(localDir, '/', sep) if not isdir(localDir): if exists(localDir): #文件存在删除 unlink(localDir) makedirs(localDir) return path #下载页面 def download(self) : try : retval = urlretrieve(self.url, self.file) except IOError: retval = ('***ERROR: invalid URL "%s"' % self.url) return retval #分析保存链接 def parseAndGetLinks(self) : self.parser = HTMLParser(AbstractFormatter( / DumbWriter(StringIO()))) self.parser.feed(open(self.file).read()) self.parser.close() return self.parser.anchorlist class NetCrawler(object): count = 0 #计数器 #构造器 def __init__(self, url) : self.queue = [url] self.seen = [] self.dom = urlparse(url)[1] #获取页面 def getPage(self, url) : dl = Downloader(url) retval = dl.download() if retval[0] == '*' : print retval, '...skipping parse' return NetCrawler.count += 1 print '/n(', NetCrawler.count, ')' print 'Url: ', url print 'File: ', retval[0] self.seen.append(url) links = dl.parseAndGetLinks() for eachLink in links : if eachLink[ : 4] != 'http' and / find(eachLink, '://') == -1: eachLink = urljoin(url, eachLink) print '*',eachLink if find(lower(eachLink), 'mailto:') != -1: print '... discarded, mailto link' continue if eachLink not in self.seen: if find(eachLink, self.dom) == -1 : print '... discarded, not in domain' else : if eachLink not in self.queue : self.queue.append(eachLink) print '... new, added to queue' else : print '... dirscarded, already in queue' else : print '... discarded, already processed' #处理队列中的链接 def run(self) : while self.queue : url = self.queue.pop() self.getPage(url) #主函数 def main() : #url = 'http://www.hao123.com/haoserver/index.htm' if len(argv) > 1 : url = argv[1] else : try : url = raw_input('Enter starting URL: ') expect (KeyboardInterrupt, EOFError) : url = '' if not url : return netCrawler = NetCrawler(url) netCrawler.run() if __name__ == '__main__' : main()

这里的程序只是简单的抓取网页,如果要抓取指定网页可以加上也正则表达式(模块)来进行处理

用python做个网络爬虫相关推荐

  1. python从零基础到项目实战怎么样-Python 3.x网络爬虫从零基础到项目实战

    ● 案例完整 本书中的所有案例都是通过"理论讲解 + 环境搭建 + 完整代码及分析 + 运行结果"这种完善的结构进行讲解的.此外,复杂的案例配有项目结构图,有难度的案例还分析了底层 ...

  2. 基于python的影评数据分析_基于Python聚焦型网络爬虫的影评获取技术

    龙源期刊网 http://www.qikan.com.cn 基于 Python 聚焦型网络爬虫的影评获取技 术 作者:郭向向 郑嘉慧 苗学芹 来源:<时代金融> 2019 年第 11 期 ...

  3. python如何在网络爬虫程序中使用多线程(threading.Thread)

    python如何在网络爬虫程序中使用多线程 一.多线程的基础知识 二.在网络爬虫中使用多线程 2.1 从单线程版本入手 2.2 将单线程版本改写为多线程版本 2.3 运行多线程版本程序 2.4 将多线 ...

  4. python数据采集有哪些技术_如何快速掌握Python数据采集与网络爬虫技术

    一.数据采集与网络爬虫技术简介 网络爬虫是用于数据采集的一门技术,可以帮助我们自动地进行信息的获取与筛选.从技术手段来说,网络爬虫有多种实现方案,如PHP.Java.Python ....那么用pyt ...

  5. 基于Python实现的网络爬虫项目——多线程下载小说并保存为txt文件(包含完整代码及注释)

    基于Python实现的网络爬虫项目--多线程下载小说并保存为txt文件(包含完整代码及注释) 一.确立预期目标 二.完成项目所需工具 三.项目需要解决的问题 问题一 问题二 问题三 问题四 问题五 问 ...

  6. Python实验1——网络爬虫及数据可视化

    Python实验1--网络爬虫及数据可视化 一.实验目标与基本要求 实验目标 基本要求 二.主要知识点.重点与难点 主要知识点 重点 难点 三.实验过程设计 获取网页 获取数据 保存到数据库 数据预处 ...

  7. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...

  8. python为什么叫爬虫-python为什么叫网络爬虫

    爬虫可以抓取网站或应用程序的内容并提取有用的价值,它还可以模拟用户在浏览器或应用程序上的操作,以实现自动化程序.今天小编主要给大家分享python为什么叫网络爬虫,希望对你们有帮助! 一.你知道什么是 ...

  9. 用python爬虫下载视频_使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...

最新文章

  1. 漫画|解读电气安全“十不准”
  2. 安装vs2017出现闪退现象_Adobe Reader 闪退
  3. 每日一题(10)—— 数组与指针
  4. 小学奥数_7649 我家的门牌号
  5. 如何制作一个横版格斗过关游戏 2 Cocos2d x 2 0 4
  6. 《Java安全编码标准》一导读
  7. w/atl的thunk技术
  8. qt传递数组给js(支持多组)
  9. 三菱plc控制步进电机实例_自动化工程师必掌握的PLC控制步进电机逻辑思路
  10. 质因数分解的一些讨论(Pollard-Rho算法)
  11. GBDT梯度提升之二分类算法个人理解
  12. samtools提取指定位置核酸或氨基酸序列
  13. 性能强大的家庭服务器,家庭服务器解决方案——硬件篇
  14. win7首次使用计算机,首次安装win7系统如何进行硬盘分区
  15. Mac 升级ruby版本
  16. Linux服务器重启后crs,Linux服务器重启后crs_stat -t 命令无法正常使用以及解决思路...
  17. 长铗:未来可被预言,区块链可被定义
  18. win10注入漏洞跳出计算机,win10操作系统本地提权漏洞
  19. 实现一个avs2码流分析工具
  20. [PHP代码审计]LightCMS1.3.7存在命令执行漏洞

热门文章

  1. Akka Actor Inbox_信箱
  2. Facebook对MySQL全表扫描性能的改进
  3. SoundPool的sample 1 not READY问题
  4. android UI进阶之仿iphone的tab效果
  5. [C++]##(两个井号)和#(一个井号)都是什么意思
  6. 初级算法——删除排序数组中的重复项
  7. sql 包含某个字符_「17」MySQL中正则表达式查询的SQL语句集锦
  8. 中切片工具怎么使用_技巧|Excel中切片器的2个使用方法!
  9. 学习C++项目——一个基于C++11简单易用的轻量级网络编程框架 1
  10. R语言︱非结构化数据处理神器——rlist包