Sunday, November 29, 2009

使用urllib2抓网页数据

搞这种事, 主要是有时候需要脚本自动化地去处理一些烦锁的事. 至少不用狂copy, paste两个动作.(-_-), 有时也少量还行, 大量就浪费生命了.

HTTP的访问过程就是一来一回的. python提供的urllib2很方便发起访问请求:
 * urllib2.urlopen(url)
url为完整的URL
 * urllib2.urlopen(request)
request为urllib2.Request类实例

这样就发起了HTTP访问请求.

现在的网站一般都会对自动处理脚本起防范的. 比如在header段的cookie,  还有就是在post请求发出的数据中加入key=value形式的一串字符串.

I. 请求的header段处理
header在python对应的数据结构就是dict, 如:
{'cookie': '111111111111111', 'Accept-Encoding': 'gzip,deflate'}
使用方法:
request = urllib2.Request(url, headers) # headers就是字典实例
retval = urllib2.urlopen(request)  # 请求将被发出去

II. post的数据处理
post的数据在python对应的数据结构是str, 如:
'person=jessinio&gender=male'

使用方法有两种:
1.
retval = urllib2.urlopen(url='http://www.google.com', data='person=jessinio&gender=male') #这样一个post请求就被发出去了.

2.
request = urllib2.Request(url, data='person=jessinio&gender=male') #指定request实例拥有的data字符串
retval = urllib2.urlopen(request)  # 请求将被发出去

* 只要知道headers和post请求需要的数据结构是对应于python哪种实例后就很容易使用urllib2库

请求发出来, 接来又来一个问题: 请求后返回的数据是什么东西?

全世界都知道返回的东西肯定是字符流~~~(-_-)

常常在平时出现这样的问题: 请求一个html文件, 但返回的不是文本数据. 比如gzip. 那就需要处理一次:
    if retval.headers.has_key('content-encoding'):
        fileobj = StringIO.StringIO()
        fileobj.write(url.read())
        fileobj.seek(0)
        gzip_file = gzip.GzipFile(fileobj=fileobj)
        context = gzip_file.read()
    else:
        context = url.read()

这样就很方便得到文本数据了.










No comments:

Post a Comment

Note: Only a member of this blog may post a comment.