爬虫 0030~ requests利刃出鞘

1-1 简介

requests第三方封装的模块,通过简化请求和响应数据的处理,简化繁琐的开发步骤和处理逻辑、统一不同请求的编码风格以及高效的数据处理特性等而风靡于爬虫市场。

参考官方文档:

1-2 下载安装

Python2/python3命令行安装

使用pip(python install package)命令安装

#  pip install requests

or

使用easy_install命令安装

# easy_install requests

1-3 程序中的引入使用

安装好request模块之后,在程序中就可以通过import引入并且使用了

接下来,通过一个简单的案例了解requests模块的使用,let上干货

# -*- coding:utf-8 -*-
# 引入requests模块
import requests

# 发送请求,得到服务器返回的响应对象,通过encoding设置响应中数据的编码
response = requests.get("http://www.sojson.com/open/api/weather/json.shtml?city=%E9%83%91%E5%B7%9E")
response.encoding="utf-8"

# 通过text打印响应中的文本数据
print(response.text)

得到结果如下:

{"message":"Success !","status":200,"city":"郑州","count":1,"data":{"shidu":"50%","pm25":61.0,"pm10":131.0,"quality":"良","wendu":"32","ganmao":"极少数敏感人群应减少户外活动","yesterday":{"date":"09日星期三","sunrise":"05:40","high":"高温 36.0℃","low":"低温 25.0℃","sunset":"19:21","aqi":70.0,"fx":"西风","fl":"<3级","type":"晴","notice":"lovely sunshine,尽情享受阳光的温暖吧"},"forecast":[{"date":"10日星期四","sunrise":"05:41","high":"高温 37.0℃","low":"低温 25.0℃","sunset":"19:20","aqi":95.0,"fx":"西风","fl":"<3级","type":"晴","notice":"晴空万里,去沐浴阳光吧"},{"date":"11日星期五","sunrise":"05:42","high":"高温 35.0℃","low":"低温 25.0℃","sunset":"19:19","aqi":75.0,"fx":"南风","fl":"3-4级","type":"阴","notice":"灰蒙蒙的天空就像模糊了的眼睛"},{"date":"12日星期六","sunrise":"05:42","high":"高温 31.0℃","low":"低温 23.0℃","sunset":"19:18","aqi":54.0,"fx":"东风","fl":"3-4级","type":"小雨","notice":"雾蒙蒙的雨天,最喜欢一个人听音乐"},{"date":"13日星期日","sunrise":"05:43","high":"高温 27.0℃","low":"低温 23.0℃","sunset":"19:17","aqi":55.0,"fx":"北风","fl":"<3级","type":"小雨","notice":"下雨了不要紧,撑伞挡挡就行"},{"date":"14日星期一","sunrise":"05:44","high":"高温 33.0℃","low":"低温 25.0℃","sunset":"19:16","aqi":62.0,"fx":"西风","fl":"<3级","type":"多云","notice":"悠悠的云里有淡淡的诗"}]}}

1-4 基本请求方式<所有的故事都发生在那年那月的懵懂>

常规情况下,所有类似给服务器发送的请求方式,都是参考W3C提供的标准进行制定的。

requests为爬虫开发者们提供了8种基本的请求方式,分别如下:

req = requests.request(method,url, **kw)
req = requests.post(url, **kw)
req = requests.get(url, **kw)
req = requests.delete(url, **kw)
req = requests.put(url, **kw)
req = requests.head(url, **kw)
req = requests.options(url, **kw)
req = requests.patch(url, **kw)

注意:由于在web开发过程中,大家发现对于服务器数据的处理方式没有一开始制定标准时设计的那么复杂,所以一般情况下都简化成了get/post两种常见的请求方式

以上请求方式中,request()方式是底层的请求方式,分别由get()/post()等方式进行了高级的实现,方便开发人员去更加快捷的使用了。
PS:如此懒的开发人员啊...

1-5 一个基本请求的使用方式<有了酒,就有了故事>

由于requests库的封装的使用方式非常统一,所以通过一种方式的请求,基本就能了解和学习到所有的请求方式的处理过程了。

这里主要通过post()方式的请求,来了解在发送请求过程中所有的事故处理方式,分别讲解如下几种情况:

  • 基本请求:空手套白狼,简单的一个请求就得到想到的数据
  • 附带参数的请求:去看丈母娘总得带点礼物,她老人家开心~才会把你要的姑娘给你啊
  • 附带JSON参数的请求:老岳父看中的更多的是人品,请求需要的可是JSON参数了
  • 返回的结果数据编码总是那么不可捉摸
  • 上传文件的请求:要结婚总是大件小件的搬东西,习惯就好了
  • 总有一些时刻是美好的~cookie准备好了吗
  • 千万不要持久战~那个会让你过期的timeout超时配置
  • 老人家总是会记性不大好,所以我们要保持好自己的会话状态Session
  • 有了证书,就有了阅历,关于SSL证书那点事儿
  • 你的人生得到了最终的成功,代理们开始为你工作了

1.5.1 基本请求方式

基本请求方式,通过request直接调用对应的函数/方法即可完成,多么的优雅

# 引入需要的模块
import requests

# 发送请求吧
res = requests.post(“http://www.baidu.com”)

# 通过text属性得到响应中的数据
print (res.text)

1.5.2 附带普通参数的请求

参数包含在一个字典对象中,将字典对象交给requests的函数即可

友情提示:在使用的时候最好看一下源码哦,有惊喜的

# 引入需要的模块
import requests

# 封装参数的字典
data = {“city”:”郑州”}
# get方式发送请求,包含参数
res = requests.get(http://..../json.html, params = data)
# post方式发送请求,包含参数
res = requests.post(“http://..../json.html, data = data)
.. .. ..

1.5.3 传递JSON参数

在请求的过程中,有些URL接口需要的参数数据并不是零散的数据,而是需要封装在一起的JSON数据,此时,可以通过json.dumps()函数将一个字典数据转换成json数据进行传递~就是这么easy

此时~requests符合人体工程学的操作就出现了,如果你提供的是字典数据,json模块提供了dumps()函数转换一下就OK了

# 引入需要的模块
import requests
imoprt json

# 封装参数的字典
data = {“city”:”郑州”}
# 转换参数
json_data = json.dumps(data)
# post方式发送请求,包含参数
res = requests.post(“http://..../json.html, data = json_data)
.. .. ..

当然,如果你提供的就是JSON字符串的话,那就easy了

# 引入需要的模块
import requests

# 封装参数的json字符串
json_data = ‘{“city”:”郑州”}’
# post方式发送请求,包含参数
res = requests.post(“http://..../json.html, json = json_data)
.. .. ..

1.5.4 返回的数据和它编码操作

返回的数据,可以根据数据的编码类型区分为二进制数据和文本数据,两种不同的数据通过两个不同的属性进行获取

  • response.content:获取响应中包含的二进制数据
  • response.text:获取响应中包含的文本数据

返回的数据,会根据响应的数据进行自动的编码,数据编码最常见的会是ISO-8859-1也就是西欧编码,容易看到乱码的情况,此时可以通过返回的响应对象response的一个属性encoding进行编码的获取和指定

  • response.encoding = “编码”
# 引入需要的模块
import requests

response = requests.post(“http://www.baidu.com”)
print(response.encoding)
print(response.text)
ISO-8859-1
å
³äº�ç�
response = requests.post(“http://www.baidu.com”)
response.encoding=”UTF-8”
print(response.text)
百度一下

1.5.5 文件上传操作

requests对象支持文件的数据流式处理,不需要将整个文件都加载到内存中,而是读取一部分传递一部分,将文件指定给requests请求的file参数即可

注意:文件的上传操作只能通过post()请求方式执行操作

传统方式,加载整个文件,然后进行上传操作

# 引入需要的模块
import requests

# 打开文件
f = open(“d:/test.txt”, “r”)
# 包装文件参数
file = {“file”:f}
# 传递文件
response = requests.post(http://httpbin.org/post, files=file)
# 打印结果
print (response)    

流式数据传递方式

# 引入需要的模块
import requests

# 打开文件
with open(“d:/test.txt”, “r”) as f:
    response = requests.post(http://httpbin.org/post, data=f) 

1.5.6 cookie操作

cookie操作是web开发过程中经常用到的一个功能,在爬虫操作过程中也是非常实用的个功能,可以用于进行诸如登陆状态记录、浏览记录等很多非常实用的功能

在requests模块中对cookie的操作进行了封装,可以直接通过响应对象的cookie属性进行操作

import requests

response = request(“http://www.badiu.com”)
print(response.cookies)# 获取整个cookie
print(r.cookies[“key”])# 根据key获取指定的值

1.5.7 请求超时设置

如果要求对于数据操作性能有要求的话,经常会针对请求比较慢的连接进行过滤处理,可以通过传递timeout参数数据进行超时时间的设置,超过超时时间的连接自动抛出异常

import requests

response = requests.get(“http://github.com”, timeout=0.1)
异常信息:requests.exceptions.ConnectTimeout

1.5.8 让多个请求包含在一个会话中

一般情况下,爬虫操作获取目标数据都是短连接,也就是获取数据时连接服务器,每次发起请求就是一个连接,获取到服务器的响应数据后连接自动断开,再次发起请求时又是一个新的请求对象了~
备注:类似打开浏览器访问了一个网页,然后关闭了浏览器,再次打开浏览器访问网页,两次访问请求就不是同一个会话了

使用测试服务器进行测试,测试服务器返回的响应对象中包含了cookie数据

import requests

response = 
requests.get(“http://httpbin.org/cookies/set/key/value”)
print(response.cookies)

response = 
requests.get(“http://httpbin.org/cookies”)
print(response.cookies)
{
  "cookies": {
    "key": "value"
  }
}

{
  "cookies": {}
}

从上面的代码中可以看到,两次请求不是同一个会话进行操作的了。如果要进行多个请求包含在同一个会话中的处理的话,通过requests模块的会话对象Session()构建一个会话请求进行操作即可

import requests

req = requests.Session()

response = 
req.get(“http://httpbin.org/cookies/set/key/value”)
print(response.cookies)

response = 
req.get(“http://httpbin.org/cookies”)
print(response.cookies)
{
  "cookies": {
    "key": "value"
  }
}
{
  "cookies": {
    "key": "value"
  }
}

1.5.9 SSL证书设置

SSL证书设置,可以让爬虫程序类似浏览器一样验证https协议访问的网站,为https请求验证SSL证书。

测试一下:(某12306网站的数字证书可是无效的哦)如下图

爬虫程序爬取该网页会出现什么问题呢?

import requests

response = requests.get(“https://kyfw.12306.cn/otn”)
print(response.text)

此时,关闭掉爬虫的对HTTPS的SSL证书验证,通过设置请求参数verify=False关闭该验证

import requests

response = requests.get(“https://kyfw.12306.cn/otn”,verify=False)
print(response.text)

我们可以看到,无效SSL证书的数据也被正常的爬取下来了。

1.5.10 代理设置

和之前讲解的urllib2一样,爬虫操作过程中,代理的设置是不可避免的一种技术手段

在requests模块中,当然也是充分考虑了代理操作的可行性

通过将代理服务器端口配置在字典中,然后通过proxies参数进行设置即可

import requests

proxies = {
    "https":"122.72.32.75:80"
}
response = requests.get("http://www.baidu.com", proxies=proxies)

print (response.text)

未完待续!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容