URL

urllib模块提供了一系列的用于操作URL的功能。其中常用的是Get操作和Post操作,这在爬虫应用中是十分常用的。对于HTML的解析,建议使用Beautiful Soup库,因为这个功能库有中文文档,所以这里不再赘述。

Get操作

urllib中的request模块可以非常方便的抓取URL内容,也就是通过GET请求获取相应的HTTP响应。具体使用可参考以下示例。

from urllib import request

with request.urlopen('http://www.baidu.com') as f:
	data = f.read()
	print('Status: {} {}'.format(f.status, f.reason))
	for k, v in f.getheaders():
		print('{}: {}'.format(k, v))
	print('Data: {}'.format(data.decode('utf-8')))

如果需要模拟浏览器发送的GET请求,就需要使用Request对象。Request对象可以添加HTTP头,这样就可以伪装成浏览器了。

将上例改写一下,改成模拟浏览器请求的方式。

from urllib import request

req = reqeust.Request('http://www.baidu.com')
req.add_header('User-Agent', 'xxxxxxxx')

with request.urlopen(req) as f:
	data = f.read()
	print('Status: {} {}'.format(f.status, f.reason))
	for k, v in f.getheaders():
		print('{}: {}'.format(k, v))
	print('Data: {}'.format(data.decode('utf-8')))

Post操作

要发送POST请求,同样是使用request模块,但是需要将要提交的参数以bytes形式传入。例如:

from urllib import request, parse

email = input('Email: ')
passwd = input('Password: ')
login_data = parse.urlencode([
	('username', email),
	('password', passwd),
	('entry', 'mweibo'),
	('client_id', ''),
	('savestate', '1'),
	('ec', '')
])

req = request.Request('https://passport.weibo.cn/sso/login')
req.add_header('Origin', 'https://passport.weibo.cn')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')

with request.urlopen(req, data=login_data.encode('utf-8')) as f:
	print('Status:', f.status, f.reason)
	for k, v in f.getheaders():
		print('%s: %s' % (k, v))
	print('Data:', f.read().decode('utf-8'))