爬虫学习笔记之requests库的使用

devtools/2025/2/10 18:05:59/

安装

pip3 install requests

实例引入

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

示例1

import requestsr = requests.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text[:100])
print(r.cookies)

在这里插入图片描述
对于requests库来说,不仅是get请求,其他类型的请求,依然可以用一句话来完成。

import requestsr = requests.get('https://www.httpbin.org/get')
r = requests.post('https://www.httpbin.org/post')
r = requests.put('https://www.httpbin.org/put')
r = requests.delete('https://www.httpbin.org/delete')
r = requests.patch('https://www.httpbin.org/patch')

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.32.3", "X-Amzn-Trace-Id": "Root=1-67a1bcff-67c413a82805784e0dee2199"}, "origin": "123.12.88.142", "url": "https://www.httpbin.org/get"
}

简单的带参请求

import requestsdata = {'name': 'zyc','age': 19,'city': 'shanghai'
}r = requests.get('https://www.httpbin.org/get', params=data)
print(r.text)
  • 结果如下:
{"args": {"age": "19", "city": "shanghai", "name": "zyc"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "www.httpbin.org", "User-Agent": "python-requests/2.32.3", "X-Amzn-Trace-Id": "Root=1-67a1bda4-6464dcc03a7428c229d63137"}, "origin": "123.12.88.142", "url": "https://www.httpbin.org/get?name=zyc&age=19&city=shanghai"
}

解析返回结果,得到一个JSON格式的数据

import requestsr = 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.32.3', 'X-Amzn-Trace-Id': 'Root=1-67a1bfdb-223cf88733acc9d0414fedc8'}, 'origin': '123.12.88.142', 'url': 'https://www.httpbin.org/get'}
<class 'dict'>

抓取网页

  • 一个简单的例子
import requests
import rer = 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', '肖申克的救赎 - The Shawshank Redemption', '泰坦尼克号 - Titanic', '罗马假日 - Roman Holiday', '唐伯虎点秋香 - Flirting Scholar', '乱世佳人 - Gone with the Wind', '喜剧之王 - The King of Comedy', '楚门的世界 - The Truman Show', '狮子王 - The Lion King']

抓取二进制数据

图片、音频、视频这些文件本质上都是由二进制组成的,由于有特定的保存格式和对应的解析方式,我们才能看到这些形形色色的多媒体。

  • 获取二进制数据
import requestsr = requests.get('https://scrape.center/favicon.ico')
print(r.text)
print(r.content)

在这里插入图片描述

  • 保存二进制数据
import requestsr = requests.get('https://scrape.center/favicon.ico')
with open('favicon.ico', 'wb') as f:f.write(r.content)

这里用到了open方法,第一个参数是文件名称,第二个参数代表以二进制的形式打开文件,可以向文件里写入二进制数据。运行当前代码后,可以看到文件夹中出现了名为favicon.ico的图标。

POST请求

代码示例

import requestsdata = {'name': 'zyc', 'age': '19', 'city': 'shanghai'}
r = requests.post('https://httpbin.org/post', data=data)
print(r.text)

结果如下:

{"args": {}, "data": "", "files": {}, "form": {"age": "19", "city": "shanghai", "name": "zyc"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "29", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.32.3", "X-Amzn-Trace-Id": "Root=1-67a2db76-69a67c1717323ff8477b371d"}, "json": null, "origin": "123.12.88.142", "url": "https://httpbin.org/post"
}

响应

除了使用text和content获取响应 的内容外,还有很多属性和方法可以获取诸如状态码、响应头、Cookie等。

import requestsr = requests.get('https://ssr1.scrape.center/')
# print(type(r.status_code), r.status_code)
# print(type(r.headers), r.headers)
# print(type(r.cookies), r.cookies)
# print(type(r.url), r.url)
print(type(r.history), r.history)

上面便分别打印了状态码、响应头、Cookie、URL、history。

高级用法

文件上传

刚刚我们抓取到了一张favicon.ico文件,就用它来模拟文件上传的过程。

import requestsfiles = {'file': open('favicon.ico', 'rb')
}r = requests.post('https://www.httpbin.org/post', files=files)
print(r.text)

结果如下:
在这里插入图片描述

Cookie设置

前面我们使用urllib库处理过Cookie,写法比较复杂,现在使用requests库来获取和设置Cookie。

获取Cookie

import requestsr = 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/>]>
BDORZ=27315

设置Cookie

import requestsheaders = {'Cookie': '这里是Cookie值,在浏览器网络请求的标头中可以找到'
}r = requests.get('请求的URL', headers=headers)
print(r.text)

Session维持

直接利用requests库中的get和post方法的确可以做到模拟网页请求的操作,但这两个方法实际上相当于不同的session,或者说是两个浏览器打开了不同的页面。鉴于此,如果第一个请求利用requests库中的post方法登录了某个网站,第二个请求想要获取登录后的个人信息,于是又去使用get方法请求个人信息页面,这样的操作是不会成功的。

  • 示例
import requestsrequests.get('https://www.httpbin.org/cookies/set/number/123456789')
r = requests.get('https://www.httpbin.org/cookies')
print(r.text)

此时输出为

{"cookies": {}
}

但如果我们使用Session对象,可以很方便的维护一个Session,而不用担心Cookie的问题。

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

结果如下:

{"cookies": {"number": "123456789"}
}

SSL证书验证

有些网站没有设置好HTTPS证书,或网站的HTTPS证书可能并不被CA机构认可,这时网站可能出现SSL证书错误的提示。此时若使用requests库来请求这类网站,便会报错。

若我们一定要爬取这个网站,可以使用verify参数控制是否验证证书。

import requestsres = requests.get('https://ssr2.scrape.center/', verify=False)
print(res.status_code)

我们也可以指定一个本地证书,用作客户端证书。(这里的前提是你真的有这两个文件)

import requestsres = requests.get('https://ssr2.scrape.center/', cert=('../certs/client.pem', '../certs/client_key.pem'))
print(res.status_code)

身份认证

对于启用了基本身份认证功能的网站,我们可以使用requests库自带的身份认证功能。

import requests
from requests.auth import HTTPBasicAuthr = requests.get('https://ssr3.scrape.center/', auth=HTTPBasicAuth('admin', 'admin'))
print(r.status_code)

上面的代码也可以简写为:

import requestsr = requests.get('https://ssr3.scrape.center/', auth=('admin', 'admin'))
print(r.status_code)

代理设置

为了防止爬取网站时被封禁IP,可以使用代理。基本例子如下:

import requestsproxies = {'http': 'http://10.10.10.10:1080','https': 'http://10.10.10.10:1080',
}requests.get('https://www.httpbin.org/get', proxies=proxies)

除了基本的HTTP代理外,requests库还支持SOCKS协议的代理

  • 安装socks库
pip3 install "requests[socks]"
  • 使用案例
import requestsproxies = {'http': 'socks5://user:password@host:port','https': 'socks5://user:password@host:port'
}
requests.get('https://www.httpbin.org/get', proxies=proxies)

http://www.ppmy.cn/devtools/157697.html

相关文章

【图像处理】- 基本图像操作

基本图像操作详解 基本图像操作是图像处理的基础&#xff0c;涵盖了对图像进行简单但重要的变换。以下是几种常见的基本图像操作及其详细说明&#xff1a; 1. 裁剪 (Cropping) 描述&#xff1a;从原始图像中提取一个矩形区域。 实现方法&#xff1a; 使用图像的坐标系指定…

什么是Prompt工程?

什么是提示工程&#xff1f; Prompt一词&#xff0c;在英语中主要用作动词、形容词、名词和副词&#xff0c;主要意思包括“促使&#xff0c;导致&#xff1b;鼓励&#xff0c;提示&#xff1b;迅速的&#xff0c;立刻的&#xff1b;准时地”等。 在人工智能的语境下&#xf…

k8s中,一.service发布服务,二.dashboard:基于网页的k8s管理插件,三.资源服务与帐号权限

一.service资源对内发布服务Cluster IP对外发布服务NodePortIngress 二.dashboard:基于网页的k8s管理插件 三.资源服务与帐号权限一.service:用户无法预知pod的ip地址以及所在的节点,多个相同的pod如何访问他们上面的服务功能:1.服务自动感知:pod迁移后访问service的ip,不受影响…

HarmonyOS:查询设备信息

说明 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 部分参数返回值为default的&#xff0c;会在正式发布的版本中配置。 本模块接口返回设备常量信息&#xff0c;建议应用只调用一次&#xff0c;不需要频繁调用…

软件工程-软件需求分析基础

基本任务 准确地回答“系统必须做什么&#xff1f;”&#xff0c;也就是对目标系统提出完整、准确、清晰、具体的要求 目标是&#xff0c;在分析阶段结束之前&#xff0c;系统分析员应该写出软件需求规格说明书&#xff0c;以书面形式准确地描述软件需求。 准则 1&#xff…

基于机器学习的DDoS检测系统实战

基于机器学习的DDoS检测系统实战&#xff08;PythonScikit-learn&#xff09;&#xff5c;毕业设计必备 摘要&#xff1a;本文手把手教你从0到1实现一个轻量级DDoS攻击检测系统&#xff0c;涵盖数据预处理、特征工程、模型训练与可视化分析。 一、项目背景与意义 DDoS&#x…

RK3568上使用C++结合V4L2拉流,并RKMPP硬件编解码,并保存为MP4文件

在RK3568平台上使用C结合V4L2捕获视频流&#xff0c;并通过RKMPP进行硬件编码后保存为MP4文件&#xff0c;可以按照以下步骤实现&#xff1a; 1. 环境准备 硬件&#xff1a;RK3568开发板、摄像头模块。软件依赖&#xff1a; Linux内核支持V4L2。Rockchip MPP库&#xff08;RKM…

接入 deepseek 实现AI智能问诊

1. 准备工作 注册 DeepSeek 账号 前往 DeepSeek 官网 注册账号并获取 API Key。 创建 UniApp 项目 使用 HBuilderX 创建一个新的 UniApp 项目&#xff08;选择 Vue3 或 Vue2 模板&#xff09;。 安装依赖 如果需要在 UniApp 中使用 HTTP 请求&#xff0c;推荐使用 uni.requ…