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.mzph.cn/news/768002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8的FPS计算代码

YOLOv8的FPS计算代码 目前是默认加载到0号GPU中&#xff0c;如果你想加载到指定GPU中&#xff0c;请手动在加载模型的时候设置 device编号 代码 import osfrom ultralytics import YOLOdef load_model(model_path):model YOLO(model_path)print(查看当前模型&#xff1a;, …

Java直接内存

直接内存如何使用 直接上代码&#xff0c;代码中有注释【对直接内存的分配以及释放】进行说明。 package cn.ordinary.util.io.file;import java.io.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.*; import ja…

js一些底层

简介: JavaScript 是一种高级编程语言&#xff0c;通常在网页开发中用于前端和后端开发。JavaScript 的底层实现是浏览器或服务器上的 JavaScript 引擎。不同的引擎可能有不同的底层实现&#xff0c;但它们都有一个共同的目标&#xff0c;即执行 JavaScript 代码。 JavaScript …

MySQL中什么是分区表?列举几个适合使用分区表的场景。

MySQL中的分区表是一种数据库设计技术&#xff0c;它将一个大表物理地分割成多个较小的部分&#xff0c;这些部分被称为分区。虽然从逻辑上看&#xff0c;分区表仍然像一个单独的表&#xff0c;但在物理层面&#xff0c;每个分区都是存储在一个独立的文件上&#xff0c;可以位于…

ARM的三个按键实验

main.c #include "key_inc.h"//封装延时函数void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}}}int main(){//按键中断初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf("in main pro\n");delay(1000);}re…

Android中的onConfigurationChanged的使用

一.什么时候调用&#xff1a; 设备配置发生变化的时候调用&#xff0c;比如&#xff1a;内外屏切换、屏幕方向&#xff08;orientation&#xff09;、键盘状态&#xff08;keyboard&#xff09;、语言环境&#xff08;locale&#xff09;、屏幕布局&#xff08;screenlayout&a…

[金三银四] 操作系统上下文切换系列

图源&#xff1a; https://zhuanlan.zhihu.com/p/540717796 文章目录 2.11 cpu 的上下文切换2.12 协程的上下文切换2.13 线程的上下文切换2.14 进程的上下文切换2.15 中断上下文切换2.16 什么时候会发生进程的上下文切换2.17 什么时候会发生线程的上下文切换2.18 什么时候会发生…

Spring AOP失效的场景

Spring AOP其实是通过动态代理实现的,那么今天要聊的这个问题就是设想什么情况不能使用动态代理,这个问题其实跟Spring事务失效的场景差不多 内部类调用 首先就是类内部的调用&#xff0c;比如一些私有方法调用&#xff0c;内部类调用&#xff0c;以及同一个类中方法的自调用…

前缀和(一)

前缀和 一维前缀和数组 假设有一个数组为a [ n ] , 另一个数组为s [ n ] . 其中 s [ j ] a[1] a[ 2 ] ......a[ j-1] a [ j ] 。--->s[ j ]表示a数组从第一个元素到第 j 个元素之和&#xff0c;那么我们则就称 s 数组为前缀和数组 例题&#xff1a;前缀和 链接&#xff1a;…

vue v-if v-show 区别

Vue中的v-if和v-show都用于控制元素的显示和隐藏&#xff0c;但它们之间存在一些关键的区别。 渲染方式&#xff1a;v-if是“惰性”的&#xff0c;这意味着在条件为假时&#xff0c;相关的组件或元素的所有事件监听器和子组件都会被销毁&#xff0c;不会渲染到DOM中。只有当条…

遥感原理与应用—绪论

一、关于基本概念与对应的英文 遥感&#xff1a;Remote Sensing 遥测&#xff1a;Telemetry&#xff0c;对被测物体某些运动参数和性质进行远距离测量的技术&#xff0c;分为接触测量与非接触测量&#xff0c;对于RS的概念&#xff0c;遥测探测的目标显得狭隘了一些&#xff…

AI女朋友 -- 一个傲娇女友,嘴上刻薄但内心关心你

文章目录 前言一、成果展示 1、ai女友2、留言板二、实现思路三、难点问题四、总结 前言 在免费API寻找过程中&#xff0c;发现了ai女友的接口&#xff0c;打算从这个接口入手&#xff0c;做出给人一种有女朋友的、温柔的、亲近的、容易给的感觉&#xff01; 一、成果展示 1、A…

Git bash获取ssh key

目录 1、获取密钥 2、查看密钥 3、在vs中向GitHub推送代码 4、重新向GitHub推送修改过的代码 1、获取密钥 指令&#xff1a;ssh-keygen -t rsa -C "邮箱地址" 连续按三次回车&#xff0c;直到出现类似以下界面&#xff1a; 2、查看密钥 路径&#xff1a;C:\U…

Kubernetes概念:工作负载:工作负载管理:2. ReplicaSet

ReplicaSet ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此&#xff0c;它通常用来保证给定数量的、完全相同的 Pod 的可用性。 ReplicaSet 的工作原理 ReplicaSet 是通过一组字段来定义的&#xff0c;包括一个用来识别可获得的 Pod 的集…

FreeCAD傻瓜教程之基准面的构建-在实体的表面上新建坐标、倾斜的平面、附加不同的台阶、旋转体等

目的&#xff1a;学会在已有模型的不同剖面上建立新的坐标系&#xff0c;并绘图&#xff1b;使得新图形仍然作为同一个零件实体的构件。 零、需求举例 在下列模型中&#xff0c;我们要在圆杆的顶部增加一个把手&#xff0c;如果点击圆杆顶部&#xff0c;则仅能在顶部圆形所在…

JVM虚拟机栈

虚拟机栈 虚拟机栈概述 栈是运行时的单位&#xff0c;而堆是存储的单位。 栈解决程序的运行问题&#xff0c;即程序如何执行&#xff0c;或者说如何处理数据。堆解决的是数据存储的问题&#xff0c;即数据怎么放&#xff0c;放在那儿。 虚拟机栈的基本内容 Java虚拟机栈 Java…

瑞吉外卖实战学习--登录功能的开发

登录功能的开发 前端1、创建实体类Employee和employee表进行映射,可以直接导入资料中提供的实体类1.1、字段名称对应上&#xff0c;有下划线的使用驼峰对应&#xff0c;因为在配置文件中进行了配置1.2、employee 文件 2、创建Controller、Service、Mapper2.1、Mapper文件2.2、定…

Windows复现SiamCAR代码遇到的报错与解决方法

一、环境基础 Windows10以上 已装Anaconda 支持GPU 已经gitclone:https://github.com/HonglinChu/SiamTrackers 二、遇到的报错 1. No module named pycocotools._mask 方案一&#xff1a;加载非常慢 conda install -c conda-forge pycocotools 方…

蓝桥杯竞赛规则及说明【C/C++】

第十五届蓝桥杯全国软件和信息技术专业人才大赛个人赛规则解析 一、组别划分 本次大赛C/C和Java两个语言分别设有四个组别:研究生组、大学A组、大学B组和大学C组。选手只能选择参加其中一个组别的竞赛,各组评奖独立进行。 组别资格对应如下: 研究生组:只限研究生参加大学A组…