Python爬虫技术系列-03requests库案例

1 Requests基本使用

Requests官方文档中关于Requests的介绍是:Requests是一个优雅而简单的Python HTTP库,是为人类构建的。
Requests可以完成,Keep-Alive,带Cookie的持久化session,SSL认证,文件上传下载等诸多功能,本小节主要介绍Requests库的安装与基本使用,尽管如此,也力求通过合适的案例,帮助读者完成对Requests的使用,更多高阶操作可以查看官网。

1.1 Requests库安装与使用

1.1.1 Requests库安装

安装Requests:

pip install requests==2.27.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

1.1.2 Rrequests库介绍

Requests 是用Python语言编写,基于urllib,但是它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。本小节主要基于requests完成数据爬取的基本操作。
两个核心对象:
Requests库包括2个核心对象:Request和Response。Request用于发送请求,Response对象用于接受服务器返回的所有信息,也包含发送的Request请求信息。

r = requests.get(url)

上面代码中,requests.get(url)构造了一个向服务器请求资源的Request对象,返回的对象r就是一个包含服务器资源的Response的对象。
Response对象的属性如下所示:
在这里插入图片描述Response案例如下:

# 使用requests进行GET请求
import requests
response  = requests.get("https://www.baidu.com")
# response的类型
print('type(response)-->',type(response))
# 返回的HTTP状态码
print('response.status_code-->',response.status_code)
# 输出Response对象转换后的字符串,会乱码
print(response.text[310:352])
# 给Response设定编码,输出无乱码
response.encoding = 'utf-8'
print(response.text[310:352])
# 把Response对象转换为bytes数据,编码为UTF-8字符串,输出字符串
print(response.content.decode("UTF-8")[310:352])

输出结果如下:

type(response)--> <class 'requests.models.Response'>
response.status_code--> 200
<title>ç™¾åº¦ä¸€ä¸‹ï¼Œä½ å°±çŸ¥é“</title>
<title>百度一下,你就知道</title></head> <body link
<title>百度一下,你就知道</title></head> <body link

从输出结果可以看出,直接输出response.text会出现乱码,因为Response的默认encoding编码为ISO-8859-1,在设置response.encoding = 'utf-8’后,输出不再乱码。最后的先转变为content,在decode的方式也可以正常输出。
Response.text()的输出给如python爬虫系列的文章中的lxml或bs4解析,就完成了数据获取到数据解析的全部流程。
Requsts库常用方法有7种,如下表所示:
在这里插入图片描述其中requests.requset(method,url,**kwargs)是核心方法,其它方法都是基于request(),当method的值为GET时,与get()方法等价。如下所示:

requests.request(‘GET’,url,**kwargs)
requests.get(url,**kwargs)

url参数为请求的路径。
**kwargs:控制访问参数,为可选项,具体含义如下所示:
在这里插入图片描述

1.1.3 使用Requests一般分为三个步骤

第一步,导入模块:

import requests

第二步,完成请求:

url = "http://httpbin.org/get"
r = requests.get(url=url)

http://httpbin.org是一个很好的测试网站, 其后台是基于 Python +Flask编写的 HTTP Request & Response Service。该服务主要用于测试 HTTP 库。 你可以向他发送请求,然后他会按照指定的规则将你的请求返回,也可以直接访问,本小节采用直接访问的方式测试。
第三步,输出获得的响应:

print("--查看请求头信息--")
print(r.text)

输出为:

--查看请求头信息--
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.27.1", 
    "X-Amzn-Trace-Id": "Root=1-62837c9a-6119e7f618e55b0f0de1d0d2"
  }, 
  "origin": "120.216.231.238", 
  "url": "http://httpbin.org/get"
}

通过输出,可以看出我们在发送请求的时候,携带的User-Agent表明了发起请求的身份为requests库,这个也是在爬取数据时,会被服务器拦截的原因。
关于requests库,目前为止,是否有一定的理解了,多谢您的互动。

关于requests的基本使用,我们会通过一个案例进行介绍。

2 Requests库使用案例

在上一小节,完成了关于Requests库的Response对象的解析,与发送简单个get请求,本小节通过案例的方式进行Requests库的使用。

2.1 携带参数,设置User-Agent,发送POST请求,文件上传

import requests
data = {'city': 'beijing'} # 设置data
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0' #设置User-Agent
}
files = {'file': open('01.gif', 'rb')} # 读取本地的一个图片
response = requests.post("http://httpbin.org/post", files=files,data=data, headers=headers) # 通过POST请求把文件,数据和header传递过去
print(response.text)

输出结果如下:

{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "data:application/octet-stream;base64,R0lGODl...HEgAA7"
  }, 
  "form": {
    "city": "beijing"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Content-Length": "1176", 
    "Content-Type": "multipart/form-data; boundary=92043b0ae4dec43bbb54919200f6033a", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0", 
    "X-Amzn-Trace-Id": "Root=1-62848095-0a1878c6321f07ef5ccc9047"
  }, 
  "json": null, 
  "origin": "120.216.231.238", 
  "url": "http://httpbin.org/post"
}

输出结果表明,文件,数据和请求头都被服务端接受,并且图片在上传过程被采用base64编码方式传递。

2.2 获取cookie

import requests
response = requests.get("https://www.zhihu.com")
print(response.cookies)
for key, value in response.cookies.items():
    print(key + '=' + value)

输出结果如下:

<RequestsCookieJar[<Cookie _xsrf=pGKfNvOikSpo8NRnLCbNKfAuLOLWyhLb for .zhihu.com/>]>
_xsrf=pGKfNvOikSpo8NRnLCbNKfAuLOLWyhLb

输出结果中,通过response.cookies获取了知乎首页的cookie,这对需要登录注册才能访问的网站,可以替代手工获取cookie进行填充,是比较方便的一种方法。

2.3 保持session 实现模拟登录

import requests
session = requests.Session() #获取session
session.get('http://httpbin.org/cookies/set/name/123') # 通过会话设置cookie的值,为name=123
response = session.get('http://httpbin.org/cookies') # 使用session获取cookie
print(response.text) # 输出响应

输出为:

{
  "cookies": {
    "name": "123"
  }
}

输出结果表明,对于两次访问,通过session发送get请求,可以获取第一次请求时设置的cookie,如果对于浏览器来说,使用session进行访问,会被服务端认为是同一个用户在持续访问,使用于需要保持登录状态的数据爬虫场景。

2.4 Requests结合lxml库

本案例采用Requests库读取百度新闻首页,F12打开浏览器,确定网页结构,然后通过lxml库进行解析,获取新闻标题和新闻链接,如下图所示:
在这里插入图片描述
从图中可以看出,热点新闻都在id="pane-news"的div标签中,该标签下有多个ul标签,每个ul标签中都对应一些新闻。获取dive标签的第1个ul子节点,并获取其下得li标签。在li标签下有a标签,a标签中的文本为新闻标题,href为新闻连接。
代码如下:

import requests
from lxml import etree

response = requests.get('http://news.baidu.com/')  # 请求百度新闻
response.encoding='utf-8'  # 设置响应编码格式
selector = etree.HTML(response.text)  # 把响应数据传递给etree模块
bd_news = selector.xpath('//div[@id="pane-news"]/ul[1]/li')  # 解析获得新闻列表
for bd_new in bd_news:
    print(bd_new.xpath(".//a[1]/text()")[0])  # 输出新闻表题 
    print(bd_new.xpath(".//a[1]/@href")[0])  #输出新闻链接

输出结果如下:

春耕春管不误时:战疫情抢农时要两手抓两手稳
https://wap.peoXXXXX692598/6565842
西安博物院:发挥“大学校”功能 让文物活起来
http://www.cnrXXXX18_525829518.shtml

张文宏领衔 首个国产新冠药对抗奥密克戎研究结果正式发表
http://baijiahXXXX8359231533

输出结果中可以看到,新闻标题和新闻连接均已获得。关于Requests还有更多的应用,本书不再进行拓展,读者可以自行研究。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT从业者张某某

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值