1. 获取html页面
其实,最基本的抓站,两句话就可以了
import urllib2
content = urllib2.urlopen('http://XXXX').read()
这样可以得到整个 html 文档,关键的问题是我们可能需要从这个文档中获取我们需要的有用信息,而不是整个文档。这就需要解析充满了各种标签的 html。
2. 解析 html
SGMLParser
Python 默认自带 HTMLParser 以及 SGMLParser 等等解析器,前者实在是太难用了,我就用 SGMLParser 写了一个示例程序:
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('utf-8')
print 'item:',item
很简单,这里定义了一个叫做 ListName
的类,继承 SGMLParser
里面的方法。使用一个变量 is_h4
做标记判定 html 文件中的 h4
标签,如果遇到 h4
标签,则将标签内的内容加入到 List
变量 name
中。解释一下 start_h4()
和 end_h4()
函数,他们原型是
SGMLParser 中的
start_tagname(self, attrs)
end_tagname(self)
tagname
就是标签名称,比如当遇到 <pre>
,就会调用 start_pre
,遇到 </pre>
,就会调用end_pre
。attrs
为标签的参数,以 [(attribute,
value), (attribute, value), ...]
的形式传回。
输出:
如果有乱码,可能是与网页编码不一致,需要替换最后一句 deconde()
的参数,我在香港淘宝默认用的是繁体编码。各位可以 copy 上面的代码自己试试,把淘宝的商品目录抓下来,就是这么简单。稍微改改,就可以抽取二级分类等其他信息。