当前位置: 首页 > news >正文

Python爬虫之requests库

1、准备工作

pip install requests

2、实例

urllib库中的urlopen方法实际上就是以GET方式请求网页,requests库中相应的方法就是get方法

import requestsr = requests.get('https://www.baidu.com/')
print(type(r))			# <class 'requests.models.Response'>  响应类型
print(r.status_code)	# 200                                 状态码
print(type(r.text))		# <class 'str'>                       响应体类型
print(r.text[:100])		# <!DOCTYPE html>...                  响应体内容
print(r.cookies)		# <RequestsCookieJar...               cookie
r = requests.get('https://www.httpbin.org/get')				# get请求
r = requests.post('https://www.httpbin.org/post')			# post请求
r = requests.put('https://www.httpbin.org/put')				# put请求
r = requests.delete('https://www.httpbin.org/delete')		# delete请求
r = requests.patch('https://www.httpbin.org/patch')			# patch请求

3、GET请求

requests库构建GET请求。

3.1、基本实例

构造一个简单的GET请求:

import requestsr = requests.get('https://www.httpbin.org/get')
print(r.text)#{
#  "args": {}, 
#  "headers": {
#    "Accept": "*/*", 
#    "Accept-Encoding": "gzip, deflate", 
#    "Host": "www.httpbin.org", 
#    "User-Agent": "python-requests/2.31.0", 
#    "X-Amzn-Trace-Id": "Root=1-65fe76c4-16fedcf50d4868a141c3d0a8"
#  }, 
#  "origin": "118.254.22.196", 
#  "url": "https://www.httpbin.org/get"
#}
#

对GET请求添加额外的参数:

data = {'name':'germey','age':25
}
r = requests.get('https://www.httpbin.org/get',params=data)
print(r.text)#{
#  "args": {
#    "age": "25", 
#    "name": "germey"
#  }, 
#}  

网页的返回类型虽然是str类型,但它很特殊,收JSON格式的。所以可调用json方法解析得到JSON格式数据。

r = requests.get('https://www.httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))# <class 'str'>
# {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'www.httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-65fe795f-16d3d7a6715859e8100771b0'}, 'origin': '118.254.22.196', 'url': 'https://www.httpbin.org/get'}
# <class 'dict'>  字典格式

3.2、抓取网页

上述链接返回的是JSON格式,若请求普通网页便能获取相应的内容。

r = requests.get('https://ssr1.scrape.center/')
pattern = re.compile('<h2.*?>(.*?)</h2>',re.S)	# 用正则表达式匹配所有标题内容
titles = re.findall(pattern,r.text)
print(titles)# ['霸王别姬 - Farewell My Concubine', '这个杀手不太冷 - Léon'...

3.3、抓取二进制数据

图片、音频、视频本质上都是由二进制数据组成。

r = requests.get('https://scrape.center/favicon.ico')	# 抓取网站图标
with open('favicon.ico','wb') as f:						# 保存二进制文件f.write(r.content)

3.4、添加请求头

若没有请求头,某些网站会发现这并不是一个由浏览器发起的请求,可能会返回异常结果,使用heders参数添加请求头。

headers = {'User-Aagent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
r = requests.get('https://ssr1.scrape.center/',headers=headers)
print(r.text)# 在这个headers参数中可以添加任意其他字段信息

4、POST请求

data = {'name':'germey','age' : 25}
r = requests.post('https://www.httpbin.org/post',data=data)
print(r.text)#{
#	...
#  "form": {				# form就是提交的数据,说明POST请求成功发送
#    "age": "25", 
#    "name": "germey"
#  }, 
#...
#}

5、响应

r = requests.get('https://ssr1.scrape.center/')
print(type(r.status_code),r.status_code)	# 状态码:  int 200
print(type(r.headers),r.headers)			# 响应头: CaseInsensitiveDict {'Date': 'Sat, 23...}
print(type(r.cookies),r.cookies)			# Cookie:  RequestsCookieJar
print(type(r.url),r.url)					# URL: str https://ssr1.scrape.center/
print(type(r.history),r.history)			# 请求历史 list []

requests库还提供了一个内置的状态码查询对象requests.codes

r = requests.get('https://ssr1.scrape.center/')
exit() if not r.status_code == requests.codes.ok else print('请求成功')# 通过比较返回码和内置的表示成功的状态码,来保证请求是否得到了正常响应。

6、高级用法

6.1、文件上传

files = {'file':open('../GET请求/favicon.ico','rb')}
r = requests.post('https://www.httpbin.org/post',files=files)
print(r.text)# "files": {
#    "file": "data:application...
#  }, 
# 证明文件上传部分会单独用一个files字段来标识

6.2、Cookie设置

获取cookie:

r = requests.get('https://www.baidu.com')
print(r.cookies)	
for key,value in r.cookies.items():print(key + '=' + value)#<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
# items方法将cookie转化为由元组组成的列表。遍历输出名称和值,实现解析。

6.3、Session维持

利用session可以做到模拟同一个会话而不用担心Cookie的问题,它通常在模拟登录成功之后,进行下一步操作时用到。

s = requests.Session()
s.get('https://www.httpbin.org/cookies/set/number/123456789')
r = s.get('https://www.httpbin.org/cookies')
print(r.text)

6.4、SSL证书验证

现在很多网站要求使用HTTPS协议,但有些网站有可能没有设置好HTTPS证书,或者网站的HTTPS证书可能不被CA机构认可,这时就可能SSL证书错误提示。

我们可以在浏览器中通过一些设置来忽略证书的验证。

可以使用verify参数控制是否验证证书,设为False在请求时不会验证证书是否有效。

response = requests.get('https://ssr2.scrape.center/',verify=False)
print(response.status_code)# 200

6.5、超时设置

为防止服务器不能及时响应,应设置一个超时时间,如超时则报错。使用timeout参数。

r = requests.get('https://www.httpbin.org/get',timeout=1)
print(r.status_code)# 实际上,请求分为两个阶段:连接(connect)和读取(read)。
# 所以timeout可以分别设置连接和读取的超时时间。
r = requests.get('https://www.httpbin.org/get',timeout=(5,30))

6.6、身份认证

通过auth参数可设置身份认证功能。

import requests
from requests.auth import HTTPBasicAuthr = requests.get('https://ssr3.scrape.center/',auth=HTTPBasicAuth('admin','admin'))
print(r.status_code)   # 200  表示身份认证成功# 简单写法:
r = requests.get('https://ssr3.scrape.center/',auth('admin','admin')) 即可

6.7、代理设置

某些网站面对频繁请求时,可能弹验证码或跳转登录界面甚至封禁。因此,通过proxies设置代理解决。

# HTTP代理:
proxies = {'http':'http://user:password@host:port','https':'http://user:password@host:port'
}
requests.get('https://httpbin.org/get',proxies=proxies)# SOCKS代理:
proxies = {'http':'socks5://user:password@host:port','https':'socks5://user:password@host:port'
}
requests.get('https://httpbin.org/get',proxies=proxies)

6.8、Prepared Request

requests在发送请求时、在内部构造了一个Request对象,并给这个对象赋予了各种参数,包括url、headers、data等。Request对象就是一个Prepared Request类型

因此,我们不用get方法,直接构造一个Prepared Request对象试试:

from requests import Request,Sessionurl='https://www.httpbin.org/post'
data = {'name':'germey'}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
s = Session()
req = Request('POST',url,data=data,headers=headers)	# 构造Request对象
prepped = s.prepare_request(req)					# 转换为Prepared Request对象
r = s.send(prepped)									# 发送请求
print(r.text)# 至此,打到与POST请求同样的效果

http://www.lryc.cn/news/324528.html

相关文章:

  • 鱼塘钓鱼(多路归并)
  • java每日一题——买啤酒(递归经典问题)
  • 最近接到一个大项目,给公司设计抢商品代金劵业务
  • 防火墙(讲解)
  • Python之装饰器-带参装饰器
  • 抖音IP属地怎么更改
  • Flutter 全局控制底部导航栏和自定义导航栏的方法
  • 检索增强生成(RAG)技术:实现流程、作用及应用案例
  • Ubuntu安装和使用
  • 【Unity】Stream最好用的Selfhost开源轻量服务
  • Web 常见的攻击方式有哪些?
  • Rancher(v2.6.3)——Rancher部署Redis(单机版)
  • stm32-模拟数字转化器ADC
  • [Repo Git] manifests的写法
  • 位置编码与长度外推
  • Linux信号补充——信号发送和保存
  • Vue3 中应该使用 Ref 还是 Reactive?
  • 红外相机和RGB相机标定:实现两种模态数据融合
  • 前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】
  • 【MySQL】2.MySQL数据库的基本操作
  • 常见技术难点及方案
  • c#关键字 static
  • redis 如何保证数据同步(数据变化时)
  • Ubuntu18.04桌面版设置静态IP地址
  • Aztec的客户端证明
  • 面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
  • 100天精通风控建模(原理+Python实现)——第23天:风控建模中的贝叶斯优化是什么?怎么实现?
  • Http 超文本传输协议基本概念学习摘录
  • 模拟-算法
  • 深入了解鸿鹄工程项目管理系统源码:功能清单与项目模块的深度解析