Python爬虫(小练习)

近日,在浏览伯乐在线(http://blog.jobbole.com/29281/)的时候碰到一些很不错的资源:25本免费的Python电子书

如下图:


其中,每本都是以名字+超链接的方式,于是激起了我写个小程序保存这些资源的欲望,顺便也能练习一些不太熟练的小爬虫 : ) 。 好了,我们开始吧!

先展示一下成果给大家看嗯: 如图

 

每本书都很有条理的保存在本地文档中,结果还是挺满意的哈。  

首先呢 要完成这些工作大概要分为一下几个步骤:

  1. 获得整个页面的源代码 (网页源码HTML)

  2. 获得目标区域的源代码 (缩小范围)

  3. 在小范围内匹配资源的URL

  4. 将匹配到的资源URL写入到本地保存

 

下面,将分为4个步骤来分部展示Python程序

第一,获得整个页面的源代码:

1 def getHtml(url):
2     html = urllib.urlopen(url)
3     sorce = html.read()
4     return sorce

  该段代码将返回资源所在的整个页面的HTML源代码

 

第二,获得目标区域的源代码 (缩小范围):

1 def getRange(content):
2     start0 = content.find(r'<div class="entry">')
3     start = content.find(r'<ol>',start0)
4     end = content.find(r'<div id="ad1">',start)
5     content2 = content[start:end]
6     return content2

 

第三,匹配资源的URL:

 

1 def getLink(content2):
2     reg = re.compile(r'<a href="(.*?[.html|.pdf]?)" target=')
3     result = reg.findall(content2)
4     return result
5 
6 def getName(content2):
7     reg = re.compile(r'<a href=".*?[.html|.pdf]?" target="_blank">(.*?)</a>')
8     result2 = reg.findall(content2)
9     return result2

  以上俩个函数分别用来匹配资源的 链接 和 书名

 

第四,保存到本体:

  即是在print 的基础上从定向到文件中。详见下面的完整代码 : )

 

下面是完整代码:

 

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import urllib
 5 import re
 6 
 7 def getHtml(url):
 8     html = urllib.urlopen(url)
 9     sorce = html.read()
10     return sorce
11 
12 def getRange(content):
13     start0 = content.find(r'<div class="entry">')
14     start = content.find(r'<ol>',start0)
15     end = content.find(r'<div id="ad1">',start)
16     content2 = content[start:end]
17     return content2
18 
19 def getLink(content2):
20     reg = re.compile(r'<a href="(.*?[.html|.pdf]?)" target=')
21     result = reg.findall(content2)
22     return result
23 
24 def getName(content2):
25     reg = re.compile(r'<a href=".*?[.html|.pdf]?" target="_blank">(.*?)</a>')
26     result2 = reg.findall(content2)
27     return result2
28 
29 if __name__ == '__main__':
30     content = getHtml(r'http://blog.jobbole.com/29281/')
31     content2 = getRange(content)
32     link = getLink(content2)
33     name = getName(content2)
34     i = 1
35     f = open('content.txt','w+')
36     for x, y in zip(name, link):
37         print >>f, str(i),": ",x,
38         print >>f
39         print >>f,y
40         i = i + 1

 

看到这里您辛苦了,谢谢 : )

 

—————————————————————————————————————————————————————————————————————————————

声明:

  本文为 大Yi巴狼 对自己所学的知识整理和实现。

  本文档欢迎自由转载,但请务必保持本文档完整或注明来之本文档。本文档未经 大Yi巴狼 同意,不得用于商业用途。最后,如果您能从这个简单文档里获得些许帮助,大Yi巴狼 将对自己的一点努力感到非常高兴;由于作者本人水平有限,如果本文档中包含的错误给您造成了不便,在此提前说声抱歉。

  祝身体健康,工作顺利。

posted @ 2014-02-17 15:57  大Yi巴狼  阅读(4030)  评论(0编辑  收藏  举报