Python 网页抓取及相关: (1)获取源码及检索

来源:互联网 发布:知彼定位软件 编辑:程序博客网 时间:2024/05/18 01:26

前一段时间用Python做了不少和网页相关的事情,积累了少许经验,故整理下笔记。


1.基本的抓取网页源码的方法

import urllib2a = urllib2.urlopen("http://www.example.com")content = a.read()a.close()print content

需要指出的一点是,如果不使用close()释放连接的话,在多次调用这一模块时会导致urlopen挂掉,只能关掉终端重开才行。

这一点我之前一直没注意,结果便是写的一个自动刷新程序隔一段时间便需要重新启动一次,不然无法工作。


有些时候,某些网站为了防止爬虫程序等非浏览器方式给服务器造成压力,会检查headers。这个时候,就可以考虑自行构建headers来伪装自己了。

url = "http://www.example.com"obheaders = {            'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36',            'DNT' : '1',            'Connection' : 'keep-alive',            'Cache-Control' : 'max-age=0',            'Accept-Language' : 'en-US,en:q=0.5',            'Accept-Encoding' : 'gzip,deflate,sdch',            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'            }req = urllib2.Request(url, headers = obheaders)a = urllib2.urlopen(req)content = a.read()a.close()
就实际使用而言,这个情况遇到的不多……一般情况下用系统默认的headers就能应付过去。

讲个小故事。

我前几天想抓取内部论坛的发贴数据时发现一个很烦心的问题,论坛用urlopen得到的数据和用firefox得到的数据不一样,urlopen得到的数据比ff得到的要旧很多。

这个问题折腾了我好久,最后在chrome的监视窗口中才意外发现,该论坛在未登录模式下服务器有缓存,而且缓存更新时间较长(保守估计有5分钟),应该是为了减轻服务器压力而设定的。

虽然用python实现论坛模拟登录也不麻烦(后续再整理),但是抓数据这事总是感觉不要和账号扯上关系比较好,于是做罢。


2.网页内容检索

使用上面的代码print出来的是网页的源码,而一般情况下我们感兴趣的是网页中的很少一部分内容,于是接下来的工作便是从这一大堆代码里检索出我们想要的内容。

我们一般使用re模块来实现内容的匹配,常用search()或findall(),以search()为例

import ret = re.search('<title>[\w\W]+?)<\/title>',content)  try:    print t.group(1)except Exception,e:    print "fail to find title"
content为之前获取到的网页源代码,本例中进行检索的是网页的标题。

search()和findall()都使用正则表达式来进行匹配,正则表达式的内容可参考http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

对于大部分动态网站,其具体页面大都是使用模板生成,于是在检索信息时多多研究下HTML标记如<h3>..</h3>以及CSS标签等,检索的效率可适当提高。