前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小白学爬虫系列-基础-requests详解

小白学爬虫系列-基础-requests详解

作者头像
小一不二三
发布2019-12-31 16:47:44
6900
发布2019-12-31 16:47:44
举报

作者:小一

介绍:放不下灵魂的搬砖者

全文共2326字,阅读全文需9分钟

Python版本3.8.0,开发工具:Pycharm

前面已经讲过如何安装并使用 requests 进行网页内容获取。但是requests 的功能可不止这些,跟我一起来看看吧

1. 获取内容
代码语言:javascript
复制
url = 'https://movie.douban.com/top250'
response = requests.get(url)
# 打印响应结果的状态码、编码方式、cookie等内容
print(response.status_code)
print(response.encoding)
print(response.cookies)

通过requests 的 get 方法获取豆瓣电影TOP 250 的响应内容,包括状态码、编码、cookie等

运行结果如下:

代码语言:javascript
复制
418
None
<RequestsCookieJar[]>

不对啊,我要的结果呢?还有418是个什么神仙状态码?于是机智的我赶紧 google 了一下

代码语言:javascript
复制
htcpcp1.0协议中的418的意义是:当客户端给一个茶壶发送泡咖啡的请求时,茶壶就返回一个418错误状态码,表示“我是一个茶壶”。

查完更懵了,这又是个什么神仙解释?

不管了,反正就是返回不正确。会不会是因为豆瓣对访问进行头部识别?刚好上一节也说过怎么设置头部,说搞就搞

代码语言:javascript
复制
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
# 打印响应结果的状态码、编码方式、cookie等内容
print(response.status_code)
print(response.encoding)
print(response.cookies)

返回结果如下

代码语言:javascript
复制
200
utf-8
<RequestsCookieJar[<Cookie bid=N_uBlMrf9mM for .douban.com/>]>

呼,果然如此,看到200不由得在心底又夸了一下自己

上面的访问使用最基本的 get 请求,那如果我要加访问参数呢?

代码语言:javascript
复制
user_info = {'username': 'yiye', 'passwd': 'zhiqiu'}
response = requests.get(url=url, headers=headers, params=user_info)

什么?你说 get 请求不安全,行,那我们来试试 post 请求

代码语言:javascript
复制
user_info = {'username': 'yiye', 'passwd': 'zhiqiu'}
response = requests.post(url=url, headers=headers, data=user_info)

注意注意:post 请求中参数名为 data,get中为 params

当有时候我们需要传递 JSON 形式的数据时,可以使用 json.dumps() 方法对数据序列化

代码语言:javascript
复制
user_info = {'username': 'yiye', 'passwd': 'xiaoyi', 'age': '18'}
response = requests.post(url=url, headers=headers, data=json.dumps(user_info))

这里解释一下什么是表单数据: 当你在登录网页时,需要你填写用户名、密码、验证码等信息进行提交,这些信息会被统一放在一个表格里面,提交给服务器进行验证。 这些提交的数据称为表单数据

同样的,当我们需要上传文件时,也可以把文件放在参数中上传

代码语言:javascript
复制
upload_file = {'file': open('test.txt', 'rb')}
response = requests.post(url=url, files=upload_file)
2. cookie配置

咦,小一哥,你怎么又提到了 cookie ,上节不是说过了吗? 对,没错,因为 cookie 对于需要登录的网站来说,太重要了!

当你成功登录一个网站的时候,你可以将本次登录的 cookie 保存在本地,等你下一次需要再次登录的时候,直接读取你本地的 cookie 内容,而不用再次输入用户名、密码等,是不是很方便?

代码语言:javascript
复制
# 获取浏览器cookie
b_cookies = response.cookies
# 将cookie 保存在本地
cookies = dict()
for i in b_cookies:
    cookies[i['name']] = i['value']
with open("file_path", 'wb') as f:
    f.write(pickle.dumps(cookies))

# 第二次访问直接通过cookie 访问
response = requests.get(url, cookies=cookies)
print(response.status_code)
print(response.encoding)
3. 会话(session)

既然提到了cookie ,那 session 也不能落下吧。

这里先普及一下什么是cookie,什么是session? 答:“cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份”。总之就是你访问一次人家就认识你了,第二次去的时候可能直接就给你开门了,而不需要再登陆。 cookie以文本格式存储在浏览器上,存储量有限; 而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全

也就是说,我们同样可以通过 session 会话去访问部分网页,不同的是,这些网页是通过服务器端 session 信息验证用户,而不是通过本地 cookie。

代码语言:javascript
复制
# 1. 获取session 
session = requests.Session()
# 2. 传入本地cookies 
content = session.get(url, cookies=cookie).text
print(content)
4. 超时配置

为防止服务器响应缓慢,导致客户端处理异常。requests请求通常利用 timeout 变量来配置最大请求时间 连接超时一般设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口的默认大小是 3

Timeout 类型:

  • 连接超时:客户端实现到远端服务器端口的连接时 request 所等待的时间。

连接超时一般设为比 3 的倍数略大的一个数值,因为 TCP 数据包重传窗口的默认大小是 3。

  • 读取超时:客户端已经连接上服务器并且发送了request后,客户端等待服务器发送请求的时间。

一般指的是服务器发送第一个字节之前的时间。

timeout 设置单一的值,将会用作 connectread 二者的 timeout。

代码语言:javascript
复制
requests.get(url=url, timeout=5)

如果要分别制定,就需要传入一个元组

代码语言:javascript
复制
requests.get(url=url, timeout=(5, 10))
5. SSL 证书验证

现在随处可见 https 开头的网站,Requests 可以为 HTTPS 请求验证 SSL 证书。 要想检查某个主机的SSL证书,你可以使用verify 参数。默认是True,表示需要验证

代码语言:javascript
复制
# 设置 verify 参数为 False,可以跳过证书验证
response = requests.get('https://输入你的网址', verify=False)
print response.text
6. 代理

“小一哥,那什么时候会用到代理呢?” “当然是当你要访问的网站对访问 IP 有限制的时候”

通过对任意请求方法提供 proxies 参数配置单个请求。

代码语言:javascript
复制
proxies = {
  "http": "代理主机ip及端口号",
  "https": "代理主机ip及端口号",
}

# 通过requests 方法设置代理访问
response = requests.get("http://www.baidu.com/", proxies = proxies)

以上就是关于 requests 库的一些常用方法,到现在为止,我们基本可以拿到我们想要的网页内容,或者设置访问头部、或者使用代理等

Python系列

Python系列会持续更新,从基础入门到进阶技巧,从编程语法到项目实战。若您在阅读的过程中发现文章存在错误,烦请指正,非常感谢;若您在阅读的过程中能有所收获,欢迎一起分享交流。

如果你也想和我一起学习Python,关注我吧!

学习Python,我们不只是说说而已

不知道你们有没有发现,我改名字了!

为什么改成『小一』呢,我还想了挺久的,一直没想好。

后来想了想,我现在刚迈出自己的第一步,从0到1,也正好处于第一阶段,干脆就叫小一算了。

当然,小千小万也不是不可以?

End

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 知秋小梦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 获取内容
  • 2. cookie配置
  • 3. 会话(session)
  • 4. 超时配置
  • 5. SSL 证书验证
  • 6. 代理
  • Python系列
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档