设为首页 收藏本站
查看: 820|回复: 0

[经验分享] 十Python之Http Web服务(网页抓取二)

[复制链接]

尚未签到

发表于 2017-5-6 09:00:23 | 显示全部楼层 |阅读模式
    上一篇讲了网页抓取的基础,分析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服务还有很多其他的东西,比如缓存、压缩等等,留给感兴趣的人自己去学习。 
 
 
 
 
 
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373607-1-1.html 上篇帖子: python中set集合如何决定是否重复? 下篇帖子: python学习--新型对象模型和传统对象模型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表