python_爬虫 04 requests库

目录

一、安装和文档地址

二、发送GET请求

添加headers和查询参数

response.text 和 response.content 的区别

三、发送POST请求

四、使用代理

五、cookie

六、session

七、处理不信任的SSL证书


 

虽然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请求

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

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

添加headers和查询参数

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

import requests

headers = {
     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER"
}
data = {
    "kw": "中国"
}
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 的区别

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

 

三、发送POST请求

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

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

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

import requests

url = "https://www.lagou.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&needAddtionalResult=false"
headers = {
    "Referer": "https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER",
    "Cookie": "LGUID=20161229121751-c39adc5c-cd7d-11e6-8409-5254005c3644; user_trace_token=20210531172956-5c418892-9a48-4fa1-8377-2c4f7a20b741; LG_HAS_LOGIN=1; hasDeliver=0; privacyPolicyPopup=false; WEBTJ-ID=20210531185241-179c20de542206-0e1348daf26807-2b6f686a-1049088-179c20de543150; RECOMMEND_TIP=true; __lg_stoken__=677cc1b348553c3ed5e9cbb7b390a2ff300eb24fefe8a8e97e42e2872fc9543fba2800c9390bbd1d173c49e0c0362f67288bd32b2db49b0ed2db58d21a0b452d975350e4ed22; index_location_city=%E5%B9%BF%E5%B7%9E; login=false; unick=""; _putrc=""; JSESSIONID=ABAAAECABIEACCAAF01E6707FDF7DE8820405BA09C6C439; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; X_HTTP_TOKEN=34e72e60c648e0f923883522611a51a83da2b43601; sensorsdata2015session=%7B%7D; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2221787087%22%2C%22first_id%22%3A%22179c20de60575-03879bc46582c2-2b6f686a-1049088-179c20de606146%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24os%22%3A%22Windows%22%2C%22%24browser%22%3A%22Chrome%22%2C%22%24browser_version%22%3A%2257.0.2987.98%22%7D%2C%22%24device_id%22%3A%22179c20de60575-03879bc46582c2-2b6f686a-1049088-179c20de606146%22%7D; _gat=1; _ga=GA1.2.2125950788.1622453397; _gid=GA1.2.1174524155.1622458625; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1622453401,1622453584,1622458348,1622460836; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1622538830; TG-TRACK-CODE=index_search; LGSID=20210601171352-cf8ce267-baa7-496a-85b4-d5c3239d2f39; LGRID=20210601171402-1ac136e6-0d19-488f-9639-d1ad2bb75fe7; SEARCH_ID=6a4a97b38c434d13830a64516514c7e3"
}
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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER",
}
proxy = {
    "http": "42.193.23.248:16817"
}
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

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie。

所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。 (参见 HTTP persistent connection). 

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

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER"
}
data = {
    "log": "123123@qq.com",
    "pwd": "12312",
    "wp-submit": "Log In",
    "redirect_to": "http://47.106.134.xx:10086/wp-blog/wp-admin/",
    "testcookie": "1"
}
login_url = "http://47.106.134.xx:10086/wp-blog/wp-login.php"
admin_url = "http://47.106.134.xx:10086/wp-blog/wp-admin/"

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
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值