主要思路:
1.各种语言利用http相关模块,发送http请求,获取reponse内容,html内容,即xml标签集。
2.利用xml分析工具和正则表达式,对收到的整个内容进行过滤和处理,获得最终想要的数据,存储起来。
网上的一个例子:
转自:http://www.lovelucy.info/python-crawl-pages.html
CUHK 上学期有门课叫做 Semantic Web,课程 project 是要搜集整个系里面的教授信息,输入到一个系统里,能够完成诸如“如果选了A教授的课,因时间冲突,B教授的哪些课不能选”、“和A教授实验室相邻的实验室都是哪些教授的”这一类的查询。这就是所谓的“语义网”了啊。。。然而最坑爹的是,所有这些信息,老师并没有给一个文档或者数据库,全要靠自己去系主页上搜集。唯一的想法是写个爬虫,令人悲哀的是,所有做这个 project 的同学,都是纯人肉手工完成,看得我只想扶墙。。。
从网页中抓取特定信息,我觉得这是一个普遍性的问题,以后经常会遇到。幸亏那个 project 只是需要我们系的所有教授的信息,大家人工也就算了。如果需要抓取的信息是海量的,举个栗子,把淘宝上所有的商品目录抓下来,那岂不是要吐血而亡?我决定好好把爬虫研究一下。
但是,我觉得 java 太啰嗦,不够简洁。Python 这个脚本语言开发起来速度很快,一个活生生的例子是因有关政策 verycd 开始自我阉割,有网友为了抢救资源,把整个 verycd 站爬了下来,镜像为SimpleCD.org。看了一下爬虫 源代码,其实挺简单。使用方法:
看看效果:http://www.lovelucy.info/demo/www.163.com
其实,最基本的抓站,两句话就可以了
import urllib2
content = urllib2.urlopen('http://XXXX').read()
这样可以得到整个 html 文档,关键的问题是我们可能需要从这个文档中获取我们需要的有用信息,而不是整个文档。这就需要解析充满了各种标签的 html。
Python 默认自带 HTMLParser 以及 SGMLParser 等等解析器,前者实在是太难用了,我就用 SGMLParser 写了一个示例程序:
import urllib2
from sgmllib import SGMLParser
class ListName(SGMLParser):
def __init__(self):
SGMLParser.__init__(self)
self.is_h4 = ""
self.name = []
def start_h4(self, attrs):
self.is_h4 = 1
def end_h4(self):
self.is_h4 = ""
def handle_data(self, text):
if self.is_h4 == 1:
self.name.append(text)
content = urllib2.urlopen('http://list.taobao.com/browse/cat-0.htm').read()
listname = ListName()
listname.feed(content)
for item in listname.name:
print item.decode('gbk').encode('utf8')
很简单,这里定义了一个叫做 ListName
的类,继承 SGMLParser
里面的方法。使用一个变量 is_h4
做标记判定 html 文件中的 h4
标签,如果遇到 h4
标签,则将标签内的内容加入到 List
变量 name
中。解释一下 start_h4()
和 end_h4()
函数,他们原型是 SGMLParser 中的
start_tagname(self, attrs)
end_tagname(self)
tagname
就是标签名称,比如当遇到 ,就会调用
start_pre
,遇到 ,就会调用
end_pre
。attrs
为标签的参数,以 [(attribute, value), (attribute, value), ...]
的形式传回。
输出:
如果有乱码,可能是与网页编码不一致,需要替换最后一句 deconde()
的参数,我在香港淘宝默认用的是繁体编码。各位可以 copy 上面的代码自己试试,把淘宝的商品目录抓下来,就是这么简单。稍微改改,就可以抽取二级分类等其他信息。