https://python-requests.org/

Requests 库入门

安装:pip install requests

基本使用

HTTP 协议

HTTP, Hypertext Transfer Protocol, 超文本传输协议。

HTTP 是一个基于”请求于响应“模式的、无状态的应用层协议。

”请求于响应“模式 :用户发起请求,服务器做出响应

无状态 :第一次请求与第二次请求之间并没有相关的关联

应用层 :指的是该协议工作在 TCP 协议之上

HTTP 协议采用 URL 作为 定位网路资源的标识

URL 格式 http://host[:port][path]

host : 合法的 Internet 主机域名或 IP 地址

port : 端口号,缺省端口为 80

path : 请求资源的路径

HTTP 协议对资源的操作

方法说明
GET请求获取URL位置的资源
HEAD请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST请求向URL位置的资源后附加新的数据
PUT请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE请求删除URL位置存储的资源

理解 PATCH 和 PUT 的区别

假设 URL 位置有一组数据 UserInfo,包括 UserID、UserName 等 20 个字段。

需求:用户修改了 UserName,其他不变。

  • 采用 PATCH,仅向 URL 提交 UserName 的局部更新请求。
  • 采用 PUT,必须将所有 20 个字段一并提交到 URL,未提交字段被删除。

PATCH 的最主要好处:节省网络带宽

Requests 库的 7 个主要方法

方法说明
requests.request()构造一个请求,支撑以下各种方法的基础方法
requests.get()获取 HTML 网页的主要方法,对应于 HTTP 的 GET
requests.head()获取 HTML 网页头信息的方法,对应于 HTTP 的 HEAD
requests.post()向 HTML 网页提交 POST 请求的方法,对应于 HTTP 的 POST
requests.put()向 HTML 网页提交 PUT 请求的方法,对应于 HTTP 的 PUT
requests.patch()向 HTMl 网页提交局部修改请求,对应于 HTTP 的 PATCH
requests.delete()向 HTML 页面提交删除请求,对应于 HTTP 的 DELETE

requests.request()

requests.request(method, url, **kwargs)

  • method:请求方式,对应 get/put/post 等 7 种
    • r=requests.request(‘GET’,url,**kwargs)
    • r=requests.request(‘HEAD’,url,**kwargs)
    • r=requests.request(PosT’,url,**kwargs)
    • r=requests.request(PUT’,url,**kwargs)
    • r=requests.request(PATCH’,url,**kwargs)
    • r=requests.request(‘delete’,url,**kwargs)
    • r=requests.request(‘OPTIONS’,url,**kwargs)
  • url:拟获取页面的 url 链接
  • **kwargs:控制访问参数,共 13 个
    • params : 字典或字节序列,作为参数增加到url中
    • data : 字典、字节序列或文件对象,作为Request的内容
    • json : JSON格式的数据,作为Request的内容
    • headers : 字典,HTTP 定制头
    • cookies:字典或 CookieJar ,Request 中的 cookie
    • auth :元组,支持 HTTP 认证功能
    • files : 字典类型,传输文件
    • timeout : 设定超过时间,秒为单位
    • proxies : 字典类型,设定访问代理服务器,可以增加登录认证
    • allow_redirects : True/False,默认为 True,重定向开关
    • stream : True/False 默认为 True,获取内容立即下载开关
    • verify : True/False,默认为 True,认证 SSL 证书开关
    • cert : 本地 SSL 证书路径

requests.get()

requests.get(url, params=None, **kwargs)

  • url:拟获取页面的 url 链接
  • params:url 中的额外参数,字典或字节流格式,可选
  • **kwargs:12 个控制访问的参数

查看源码:

import requests

print(requests.__file__)

可以看到,get 方法还是调用 requests 的方法来实现的,

Requests 库的 2 个重要对象

r = requests.get(url)

Response 对象包含爬虫返回的内容

Request

Response 对象

说明requests.get()**返回的是一个 **Response** 对象,**这个对象 封装了一次 HTTP 响应的全部内容

查看 get 请求获得页面的头部信息

Response 对象的属性
属性说明
r.status_codeHTTP 请求的返回状态
r.textHTTP 响应内容的字符串形式,即 url 对应的页面内容
r.encoding从 HTTP header 中猜测的响应内容编码方式
r.apparent_encoding从内容中分析出的响应内容编码方式
r.contentHTTP 响应内容的二进制形式
编码方式的区别

r.encoding 的编码方式是从 HTTP header 中的 charset 字段获得的

如果 header 中不存在 charset,则认为编码为 ISO-8859-1 (这个编码并不能解析中文)

r.apparent_encoding 根据 HTTP 的内容部分,去分析内容中的文本可能的编码形式

具体的使用就是:

当r.text返回的内容不可读的时候,

使用r.encoding发现编码方式为 ISO-8859-1 ,

使用r.apparent_encoding发现备选编码方式为 utf-8,

此时,我们就可以用r.encoding = 'utf-8'将编码方式切换,

再次使用r.text输出,中文字符就可以正常显示了。

requests.head()

requests.head(url, **kwargs)

  • url:拟获取页面的 url 链接
  • **kwargs:12 个控制访问的参数

用 head 方法可以用很少的网络流量获取网络资源的概要信息

requests.post()

requests.post(url, data=None, json=None, **kwargs)

  • url:拟更新页面的 url 链接
  • data:字典、字节序列或文件,Request 的内容
  • json:JSON 格式的数据,Request 的内容
  • **kwargs:11 个控制访问的参数

向 URL POST 一个字典自动编码为 form(表单)

requests.put()

requests.post(url, data=None, **kwargs)

  • url:拟更新页面的 url 链接
  • data:字典、字节序列或文件,Request 的内容
  • **kwargs:12 个控制访问的参数

和 POST 方法类似,只不过 put 可以将原有的数据覆盖

requests.patch()

requests.patch(url, data=None, **kwargs)

  • url:拟更新页面的 url 链接
  • data:字典、字节序列或文件,Request 的内容
  • **kwargs:12 个控制访问的参数

requests.delete()

requests.delete(url, **kwargs)

  • url:拟删除页面的 url 链接
  • **kwargs:12 个控制访问的参数

爬取网页的通用代码框架

Requests 库的异常

异常说明
requests.ConnectionError网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常
r.raise_for_status()可以判断返回的 Response 类型是不是 200, 如果不是 200,产生异常 requests.HTTPError

爬取网页的通用代码框架

正常爬取:

产生异常

测试

尽管 Requests 库功能很友好、开发简单(其实除了 import 外只需一行主要代码),但其性能与专业爬虫相比还是有一定差距的。请编写一个小程序,“任意”找个 url ,测试一下成功爬取100次网页的时间。(某些网站对于连续爬取页面将采取屏蔽IP的策略,所以,要避开这类网站。)

网络爬虫的“盗亦有道”

网络爬虫引发的问题

网络爬虫的尺寸

网络爬虫的性能骚扰

网络爬虫的法律风险

网络爬虫给的隐私泄露

网络爬虫的规则和限制

来源审查:判断User‐Agent进行限制

  • 检查来访HTTP协议头的User‐Agent域,只响应浏览器或友好爬虫的访问

发布公告:Robots协议

  • 告知所有爬虫网站的爬取策略,要求爬虫遵守

Robots 协议

Robots Exclusion Standard 网络爬虫排除标准

作用:网站告知网络爬虫哪些页面可以爬取,哪些不可以。

形式:在网站根目录下的 robots.txt

案例:

京东的 Robots 协议

(我测试的时候,发现并没有 https://www.jd.com/robots.txt 这个静态资源,可能是京东做了其他的反爬措施吧)

百度的 Robots 协议

https://www.baidu.com/robots.txt

新浪

QQ

Robots 协议的基本语法

Robots 协议的遵守方式

Robots 协议的使用

网络爬虫:自动或人工识别 robots.txt,再进行内容爬取。

约束性:Robots 协议是建议但非约束性,网络怕爬虫可以不遵守,但存在法鲁风险

原则:类人行为可不参考 Robots 协议

Requests 库网络爬虫实战

实例一:京东商品页面的爬取

(实际上,目前为止京东的反爬已经很成熟了,未登录的用户是访问不了商品信息的,所以直接那一个商品链接去爬取,是不会得到商品信息的)

https://item.jd.com/12319257.html?spmTag=YTAyMTkuYjAwMjM1Ni5jMDAwMDY0MDkuMTQ&pvid=0403b0a764ec453ea9817e8c75a44b99

实例二:亚马逊商品页面的爬取

显然,对于当前的网站来说反爬机制很完善了,仅靠修改 user-agent 头并不能完全爬取

实例三:百度 360 搜索关键词提交

搜索引擎关键词提交接口:

百度:https://www.baidu.com/s?wd=keyword

360:https://www.so.com/s?q=keyword

这个链接进去是一个验证页面。

核心原因是百度的反爬虫机制识别出了我的请求不是真实浏览器发出的,而是程序(爬虫)请求,因此触发了验证码拦截来验证访问者身份

要想绕过还是得伪装请求头:

实例四:网络图片的爬取

找一张图片,复制其地址:

https://img0.dili360.com/pic/2025/12/31/6954ebc48ed745o09300347.jpg

显然,我们并不能直接去爬取

还是通过添加 headers 请求头,解决 403 问题

全代码:

实例五:IP 地址归属地的自动查询

https://www.ip138.com/iplookup.php?ip=120.0.23.3&action=2