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

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

安装

pip3 install requests

实例引入

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

示例1

import requests

r = 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 requests

r = 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 requests

r = 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 requests

data = {
    '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 requests

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.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 re

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

抓取二进制数据

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

  • 获取二进制数据
import requests

r = requests.get('https://scrape.center/favicon.ico')
print(r.text)
print(r.content)

在这里插入图片描述

  • 保存二进制数据
import requests

r = requests.get('https://scrape.center/favicon.ico')
with open('favicon.ico', 'wb') as f:
    f.write(r.content)

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

POST请求

代码示例

import requests

data = {'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 requests

r = 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 requests

files = {
  '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 requests

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

设置Cookie

import requests

headers = {
  'Cookie': '这里是Cookie值,在浏览器网络请求的标头中可以找到'
}

r = requests.get('请求的URL', headers=headers)
print(r.text)

Session维持

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

  • 示例
import requests

requests.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 requests

s = 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 requests

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

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

import requests

res = 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 HTTPBasicAuth

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

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

import requests

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

代理设置

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

import requests

proxies = {
  '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 requests

proxies = {
  'http': 'socks5://user:password@host:port',
  'https': 'socks5://user:password@host:port'
}
requests.get('https://www.httpbin.org/get', proxies=proxies)

http://www.kler.cn/a/539791.html

相关文章:

  • TCP服务器与客户端搭建
  • Spring Boot接入Deep Seek的API
  • 物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统
  • ChatGPT提问技巧:行业热门应用提示词案例-文案写作
  • 鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.
  • 基于微信小程序的医院预约挂号系统的设计与实现
  • 数据可视化技术综述(4)衡量数据的性能指标的十大维度
  • [Deepseek+Heygen+剪映]快速生产数字人讲解的视频内容
  • 【机器学习】scikit-learn调用KNN算法并手动模仿封装自己的KNN算法
  • 深入解析 FFmpeg 的 AAC 编解码过程
  • Python 鼠标轨迹 - 防止游戏检测
  • NPM 的扁平化目录与幻影依赖问题,以及 PNPM 如何通过硬链接和软链接解决
  • Ranger Admin安装MySQL初始化问题解决
  • Git 基础命令详解:从零开始掌握版本控制
  • idea项目列表不出现,展示loading
  • webpack配置项之---output.asyncChunks
  • 探索Scikit-learn:Python中的机器学习宝库
  • 学习script setup 语法糖
  • 哈佛大学“零点项目”(Project Zero)简介
  • idea 如何使用deepseek 保姆级教程
  • IDEA升级出现问题Failed to prepare an update Temp directory inside installation
  • idea Ai工具通义灵码,Copilot我的使用方法以及比较
  • Linux网络编程6——UDP通信
  • 深入解析 Sojson.v6 混淆加密机制
  • ArcGIS实现提取处于某一属性下栅格tif中的建筑物shp
  • 机器学习-智能写作助手