python抓取web页面_十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)) #

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)) #

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值