Requests:让HTTP服务人类

虽然Python的标准库中urllib2模块中已经包含了平常我们使用的大多数功能,但是它的API使用起来让人感觉不太好,而Requests自称"HTTP for Humans",说明使用更简单方便。

Requests唯一的一个非转基因的Python HTTP库,人类可以安全享用

Requests继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的URL和POST数据自动编码。

requests的底层实现其实就是urllib3

Requests的文档非常完备,中文文档也相当不错。Requests能完全满足当前网络的需求,支持Python2.6-3.5,而且能在PyPy下完美运行。

开源首地址:https://github.com/kennethreitz/requests

中文文档API: http://docs.python-requests.org/zh_CN/latest/index.html

安装方式

利用pip安装或者利用easy_install都可以完成安装:

$pip install requests

$easy_install requests

基本GET请求(headers参数和parmas参数)

  1. 最基本的GET请求可以直接用get方法
response = requests.get("http://www.baidu.com/")

#也可以这么写
#response = requests.request("get", "http://www.baidu.com/")
  1. 添加headers和查询参数

如果想添加headers,可以传入headers参数来参加请求头中的headers信息,如果要将参数放在url中传递,可以利用params参数。

import requests

kw = {'wd':'长城'}

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

#params接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s?", params=kw, headers = headers) #查看响应内容,response.text返回的是Unicode格式的数据
print(response.text) #查看响应内容,response.content返回的字节流数据
print(response.content) #查看完整url地址
print(response.url) #查看响应头部字符编码
print(response.encoding) #查看响应码
print(response.status_code)

运行结果

......

......

'http://www.baidu.com/s?wd=%E9%95%BF%E5%9F%8E'

'utf-8'

200
  • 使用response.text时,Requests会基于HTTP响应的文本编码自动解码响应内容,大多数Unicode字符集都能被无缝地解码。
  • 使用response.content时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。

基本POST请求(data参数)

  1. 最基本的GET请求可以直接用post方法
response = requests.post("http://www.baidu.com/", data=data)
  1. 传入data数据

    对于POST请求来说,我们一般需要为它增加一些参数。那么醉基本的穿参方法可以利用data这个参数。
import requests

formdata = {
"type":"AUTO",
"i":"i love python",
"doctype":"json",
"xmlVersion":"1.8",
"keyfrom":"fanyi.web",
"ue":"UTF-8",
"action":"FY_BY_ENTER",
"typoResult":"true"
} url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null" headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"} response = requests.post(url, data=formdata, headers=headers) print(response.text) #如果是json文件可以直接显示
print(response.json())

运行结果

{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":2,"translateResult":[[{"src":"i love python","tgt":"我喜欢python"}]],"smartResult":{"type":1,"entries":["","肆文","高德纳"]}}

{u'errorCode': 0, u'elapsedTime': 0, u'translateResult': [[{u'src': u'i love python', u'tgt': u'\u6211\u559c\u6b22python'}]], u'smartResult': {u'type': 1, u'entries': [u'', u'\u8086\u6587', u'\u9ad8\u5fb7\u7eb3']}, u'type': u'EN2ZH_CN'}

代理(proxies参数)

如果需要使用代理,你可以通过为任意请求方法提供proxies参数来配置单个请求:

import requests
#根据协议内容,选择不同的代理
proxies = {
"http":"http://12.34.56.79:9527",
"https":"http://12.34.56.79:9527"
} response = requests.get("http://www.baidu.com", proxies = proxies)
print(response.text)

也可以通过本地环境变量HTTP_PROXY和HTTPS_PROXY来配置代理:

export HTTP_PROXY="http://12.34.56.79:9527"
export HTTPS_PROXY="https://12.34.56.79:9527"

私密代理验证(特定格式)和Web客户端验证(auth参数)

urllib2这里的做法比较复杂,requests只需要一步:

私密代理

import requests

#如果带来需要使用HTTP Basic Auth,可以使用下面这种格式:
proxy = {"http":"mr_mao_hacker:sffgr9r@61.158.163.130:16816"} response = requests.get("http://www.baidu.com", proxies=proxy) print(response.text)

web客户端验证

如果是Web客户端验证,需要添加auth=(账户名,密码)

import requests

auth={"test":"123456"}

response = requests.get("http://192.168.199.107", auth=auth)

print(response.text)

urllib2泪奔...

Cookies和Sission

Cookies

如果一个相应中包含了cookie,那么我们可以利用cookies参数拿到:

import requests

response = requests.get("http://www.baidu.com/")

#7.返回cookieJar对象:
cookiejar = response.cookies #8.将CookieJar转为字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar) print(cookiejar) print(cookiedict)

运行结果:

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>

{'BDORZ': '27315'}

**Session

在requests里,session对象是一个非常常用的对象,这个对象代表依次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。

会话能让我们在跨请求时候保持某些参数,比如在同一个Session实例发出的所有请求之间保持cookie

实现人人网登陆

import requests

#1.创建session对象,可以保存Cookie值
ssion = requests.session() #2.处理headers
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} #3.需要登陆的用户名和密码
data={"email":"mr_mao_hacker@163.com", "passwd":"alarmchime"} #4.发送附带用户名和密码的请求,并获取登陆后的Cookie的值,保存在session里
ssion.post("http://www.renren.com/PLogin.do", data=data) #5.ssion包含用户登陆后的cookie值,可以直接访问那些登陆后的页面
response = ssion.get("http://www.renren.com/410043129/profile") #6.打印响应内容
print(response.text)

处理HTTPS请求SSL证书验证

Requests也可以为HTTPS请求验证SSL证书:

  • 要想检查某个主机的SSL证书,你可以使用verify(也可以不写)
import requests
response = requests.get("https://www.baidu.com", verify=true) #也可以省略不写
#response = requests.get("https://www.baidu.com/")
print r.txt

运行结果:

<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge>百度一下,你就知道
  • 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError,据说12306证书是自己做的:

来测试一下:

import requests

response = requests.get("https://www.12306.cn/mormhweb/")

print(response.text)

果然:

SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

如果我们想跳过12306的证书验证,把verify设置为False就可以正常请求了。

r = requests.get("https://www.12306.cn/mormhweb/", verify = False)

Python爬虫(八)_Requests的使用的更多相关文章

  1. python爬虫基础_requests和bs4

    这些都是笔记,还缺少详细整理,后续会更新. 下面这种方式,属于入门阶段,手动成分比较多. 首先安装必要组件: pip3 install requests pip3 install beautifuls ...

  2. 2.Python爬虫入门_requests

    #2019-11-23 #requests的api使用非常简单 import requests import time if __name__=='__main__': # get请求 url_get ...

  3. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  4. 孤荷凌寒自学python第八十天开始写Python的第一个爬虫10

    孤荷凌寒自学python第八十天开始写Python的第一个爬虫10 (完整学习过程屏幕记录视频地址在文末) 原计划今天应当可以解决读取所有页的目录并转而取出所有新闻的功能,不过由于学习时间不够,只是进 ...

  5. Python爬虫之selenium的使用(八)

    Python爬虫之selenium的使用 一.简介 二.安装 三.使用 一.简介 Selenium 是自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏 ...

  6. Python 爬虫从入门到进阶之路(八)

    在之前的文章中我们介绍了一下 requests 模块,今天我们再来看一下 Python 爬虫中的正则表达的使用和 re 模块. 实际上爬虫一共就四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网 ...

  7. 小白学 Python 爬虫(41):爬虫框架 Scrapy 入门基础(八)对接 Splash 实战

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. python爬虫Scrapy(一)-我爬了boss数据

    一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...

  9. Python爬虫(1):基础知识

    爬虫基础知识 一.什么是爬虫? 向网站发起请求,获取资源后分析并提取有用数据的程序. 二.爬虫的基本流程 1.发起请求 2.获取内容 3.解析内容 4.保存数据 三.Request和Response ...

随机推荐

  1. Travel

    Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】

    yuanwen http://www.jb51.net/article/32511.htm 写 addEventListener 和 attachEvent 区别的博文不少,不过大部分都把重点放置于前 ...

  3. 从ELK到EFK演进

    背景 作为中国最大的在线教育站点,目前沪江日志服务的用户包含网校,交易,金融,CCTalk 等多个部门的多个产品的日志搜索分析业务,每日产生的各类日志有好十几种,每天处理约10亿条(1TB)日志,热数 ...

  4. sql select case when 语句

    有道笔试题: 服务器监控表server_status中,当服务器状态发生server_status变化时数据表中将被插入一条记录,状态0表示停机  1表示正常,用SQL查询Server A 的停机开始 ...

  5. Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环

    Windows SDK 编程的一般步骤为: 1. 注册窗口类, 使用到的结构 WNDCLASSEX, 函数 RegisterClassEx. 2. 创建窗口, 函数 CreateWindowEx. 3 ...

  6. 选择排序-Python与PHP实现版

    选择排序Python实现 import random # 生成待排序数组 a=[random.randint(1,999) for x in range(0,36)] # 选择排序 def selec ...

  7. socket.io 入门篇(一)

    本文原文地址:https://www.limitcode.com/detail/591b114bb1d4fe074099d9c9.html 前言 本篇介绍使用node.js模块组件socket.io实 ...

  8. 向maven中添加本地jar包

    <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java& ...

  9. .net 系列:并发编程之一 并发编程的初步理论

    一.关于并发编程的几个误解 1)并发就是多线程 实际上多线程只是并发编程的一种形式而已,在C#中还有很多其他的并发编程技术,包括异步编程,并行编程,TPL数据流,响应式编程等.  2)只有大型服务器才 ...

  10. C/C++中如何接收return返回来的数组元素

    我们知道return语句作为被调用函数的结束,返回给调用者函数值.一般来说,是返回一个函数值,像一个int, double,char等类型的数据,当然也可以是他们的指针.但是当我们遇到要返回很多数怎么 ...