`

十Python之Http Web服务(网页抓取二)

阅读更多

    上一篇讲了网页抓取的基础,分析html,但是我们所得到的html内容必须是通过编程的方式获取到的。

    简单地讲,HTTP web 服务是指以编程的方式直接使用 HTTP 操作从远程服务器发送和接收数据。P

ython3 带有两个库用于和HTTP web 服务交互:

    http.client 是实现了RFC 2616, HTTP 协议的底层库。

    urllib.request 建立在http.client之上一个抽象层。 它为访问HTTP 和 FTP 服务器提供了一个标准的API,可以自动跟随HTTP 重定向, 并且处理了一些常见形式的HTTP 认证。

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':'abc@163.com','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':'abc@163.com','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服务还有很多其他的东西,比如缓存、压缩等等,留给感兴趣的人自己去学习。 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics