上一篇讲了网页抓取的基础,分析html,但是我们所得到的html内容必须是通过编程的方式获取到的。
简单地讲,HTTP web 服务是指以编程的方式直接使用 HTTP 操作从远程服务器发送和接收数据。P
ython3 带有两个库用于和HTTP web 服务交互:
1. 一个简单的http 服务请求
import urllib.request as request if __name__ == '__main__': response = request.urlopen("http://www.baidu.com") data = response.read() print(type(data)) # <class 'bytes'> print(data) #输出字节码内容 print(str(data,encoding = "utf-8")) #将字节码转换成utf-8编码的字符串
(1)在Python中操作http web请求非常简单;urllib.request模块有一个方便的函数urlopen() ,它接受你所要获取的页面地址,然后返回一个类文件对象,您只要调用它的read()方法就可以获得网页的全部内容
(2)urlopen().read()方法总是返回bytes对象,而不是字符串。记住字节仅仅是字节,字符只是一种抽象。 HTTP 服务器不关心抽象的东西。如果你请求一个资源,你得到字节。 如果你需要一个字符串,你需要确定字符编码,并显式的将其转化成字符串。
2. 使用post请求发送数据
import urllib.request as request from urllib.parse import urlencode if __name__ == '__main__': param = {'email':'[email protected]','password':'test','origURL':'http://www.renren.com/Home.do','domain':'renren.com'} param = urlencode(param).encode('utf-8') #url编码后再进行utf-8转换成bytes print(type(param)) # <class 'bytes'> print(param) #b'origURL=http%3A%2F%2Fwww.renren.com%2FHome.do&domain=renren.com&password=test&email=abc%40163.com' response = request.urlopen("http://www.renren.com/ajaxLogin/login",param) print(str(response.read(),'utf-8')) #会看到结果里有提示用户名密码不匹配
(1)post请求发送的数据不能跟在url后面,所以我们可以将字典类型的数据通过urlencode转化成字符串的数据格式,再通过encode转化成字节码的形式。
(2)urlopen第二个参数即为post提交的bytes类型的数据。
(3)模拟了一个人人的登陆,在返回结果里面可以收到服务器的返回“您的用户名和密码不匹配” ,说明我们的数据已经通过post提交到了服务器(就算此处用正确的用户名密码也登陆不进去,因为人人网的密码是加密传递的,需要加密后的密码才能登陆成功)
3. httplib2介绍
httplib2一个第三方的开源库,它比http.client更完整的实现了HTTP协议,同时比urllib.request提供了更好的抽象。可以下载python3对应的版本(目前最新版本的名称:httplib2‐python3‐0.5.0.zip),可以通过https://httplib2.googlecode.com/files/httplib2-python3-0.5.0.zip 进行下载(有可能被墙,你懂的),下载后解压进行安装,我的解压目录为:E:\daokun\python\diveintopython3-cn\httplib2-python3-0.5.0,在CMD窗口里面cd到解压目录,又因我的python安装在D:\Python32\目录下,所以我的安装命令为:D:\Python32\python.exe setup.py install ,安装后即可使用httplib2。
一个httplib2示例
import httplib2 if __name__ == '__main__': httplib2.debuglevel = 1 h = httplib2.Http(".cache") response,content = h.request("http://www.12306.cn/mormhweb/zxdt/tlxw_tdbtz53.html") print(len(content)) print(response.status) print(response.fromcache) print(response)
(1)httplib2.debuglevel = 1 可以获取一些隐藏信息,链接、发生的数据、响应及header头信息等。
(2)httplib2的主要接口是Http对象。你创建Http对象时总是应该传入一个目录名,具体原因是在此目录下创建缓存。目录不需要事先存在,httplib2会在必要的时候创建它。
(3)一旦你有了Http对象, 获取数据非常简单,以你要的数据的地址作为参数调用request()方法就可以了。这会对该URL执行一个HTTP GET请求.
(4)request() 方法返回两个值。第一个是一个httplib2.Response对象,其中包含了服务器返回的所有HTTP头。比如, status为200 表示请求成功。
(5)content 变量包含了HTTP服务器返回的实际数据。数据以bytes对象返回,不是字符串。 如果你需要一个字符串,你需要确定字符编码并自己进行转换。
httplib2的post请求
import httplib2 from urllib.parse import urlencode if __name__ == '__main__': httplib2.debuglevel = 1 h = httplib2.Http(".cache") param = {'email':'[email protected]','password':'test','origURL':'http://www.renren.com/Home.do','domain':'renren.com'} response3,content3 = h.request("http://www.renren.com/ajaxLogin/login","POST",urlencode(param)) print(str(content3,'utf-8'))
(1)h.request第一个参数是url。
(2)第二个参数是请求的类型,这里是POST。
(3)第三个参数是经过url编码后要发送到服务器的数据。
(4)同样我们在返回的结果里面看到服务器的返回有提示说:用户名或密码错误。
Http Web服务还有很多其他的东西,比如缓存、压缩等等,留给感兴趣的人自己去学习。