1.4-python爬虫之requests库

系列文章目录

python爬虫目录



前言

摘录自B站对应课程笔记
不愧是清华大佬!把Python网络爬虫讲得如此简单明了!从入门到精通保姆级教程(建议收藏)

以下是本篇文章正文内容,下面案例可供参考


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

一、安装和文档地址

利用pip可以非常方便的安装:

pip install requests

中文文档:http://docs.python-requests.org/zh_CN/latest/index.html
github地址:https://github.com/requests/requests

二、发送GET请求

1、最简单的发送get请求就是通过requests.get来调用

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

2、添加headers和查询参数
如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params 参数。相关示例代码如下

import requests
 
headers = {
     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
data = {
    "kw": "python"
}
url = "https://www.baidu.com/s"
# params 接收一个字典或字符串的查询参数,字典类型自动转换为 url, 不需要 urlencode()
response = requests.get(url=url, params=data, headers=headers)
 
# 查看响应码
print("status_code: {}".format(response.status_code))  # status_code: 200
 
# 查看解码 response.text 时使用的解码方式
print("encoding:{}".format(response.encoding))  # encoding:utf-8
 
# 查看完整的 url 地址
print("url:{}".format(response.url))  # url:https://www.baidu.com/
 
# 查看响应内容,response.content 返回的字节流数据
print("context:{}".format(response.content))
 
# Requests 会自动解码后的内容,大多数 unicode 字符集都能被无缝地解码。
print("text:{}".format(response.text))

response.text 和 response.content 的区别
response.content:这个是直接从网络上面抓取的数据,没有经过任何解码。所以是一个bytes类型。其实在硬盘上面和在网络上传输的数据都是bytes类型。
response.text: 这个是str 的数据类型,是 requests 库将 response.content 进行解码的字符串。解码需要指定一个编码方式,requests会根据自己的猜测来判断解码的方式。所以有时候可能会猜测错误,就会导致解码后产生乱码,这时候就应该使用response.content.decode("utf-8") 进行解码。

三、发送POST请求

1、最基本的POST请求可以使用post方法:

response = requests.post("http://www.baidu.com/",data=data)

2、传入data数据
这时候就不要再使用urlencode进行编码了,直接传入一个字典进去就可以了。比如请求拉勾网的数据的代码:

import requests
 
url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false"
headers = {
    "Referer": "https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
    "Cookie": "xxxx"
}
data = {
    "first": "true",
    "pn": 1,
    "kd": "python"
}
 
response = requests.post(url=url, data=data, headers=headers)
print(response.text)
print(response.json())  # 调用内置的 JSON 解码器解析数据

发送post 请求非常简单,直接调用 requests.post 方法就可以了。如果返回的是 json 数据,那么可以调用 response.json() 来将json 字符串转为字典。如果 JSON 解码失败, response.json() 就会抛出一个异常。
要检查请求是否成功,请使用 response.raise_for_status() 或者检查 response.status_code 是否和你的期望相同。

四、使用代理

使用requests添加代理也非常简单,只要在请求的方法中(比如get或者post)传递proxies参数就可以了。示例代码如下:

import requests
 
url = "http://httpbin.org/ip"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
}
proxy = {
    "http": "111.111.222.222:xxx"
}
resp = requests.get(url=url, headers=headers, proxies=proxy)
print(resp.text)

五、cookie

如果在一个响应中包含了cookie,那么可以利用cookies属性拿到这个返回的cookie值:

import requests
url = "http://www.baidu.com"
resp = requests.get(url)
print("cookies: {}".format(resp.cookies))
print("cookies_dict: {}".format(resp.cookies.get_dict()))
"""
结果:
    cookies: <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
    cookies_dict: {'BDORZ': '27315'}
"""

六、session

之前使用urllib库,是可以使用opener发送多个请求,多个请求之间是可以共享cookie的。那么如果使用requests,也要达到共享cookie的目的,那么可以使用requests库给我们提供的session对象。注意,这里的session不是web开发中的那个session,这个地方只是一个会话的对象而已。还是以登录人人网为例,使用requests来实现。示例代码如下 :

import requests
 
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
data = {
    "email": "123123@qq.com",
    "password": "xxxx"
}
login_url = "http://www.renren.com/Plogin.do"
admin_url = "http://www.renren.com/123123/profile"
 
session = requests.Session()
# 登陆
session.post(login_url, data=data, headers=headers)
# 进入管理页面
response = session.get(admin_url)
with open("admin.html", "wb") as f:
    f.write(response.content)

七、处理不信任的SSL证书

对于那些已经被信任的SSL整数的网站,比如https://www.baidu.com/,那么使用requests直接就可以正常的返回响应。示例代码如下:

resp = requests.get('http://www.12306.cn/mormhweb/',verify=False)
print(resp.content.decode('utf-8'))
  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Nosimper

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值