【愚公系列】《Python网络爬虫从入门到精通》005-请求模块requests

举报
愚公搬代码 发表于 2025/04/30 23:49:27 2025/04/30
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳...
标题 详情
作者简介 愚公搬代码
头衔 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。
博客内容 .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎 👍点赞、✍评论、⭐收藏

🚀前言

在Python的丰富生态中,网络请求是我们进行数据交互和服务集成的重要环节。而在众多网络请求库中,requests模块凭借其简洁易用的接口和强大的功能,成为了开发者的首选。无论是发送GET、POST请求,还是处理响应数据,requests都能轻松应对,极大地简化了我们的编码工作。

在这篇文章中,我们将深入探索requests模块的基本用法和一些高级特性,帮助你更好地理解如何使用它进行高效的网络请求。同时,我们还会介绍一些常见的用例,如API调用、数据抓取和错误处理等,确保你能够在实际项目中灵活运用。

🚀一、请求模块requests

🔎1. 安装与简介

  • 安装:
    pip install requests
    
  • 核心特性:
    • 支持 Keep-Alive 和连接池
    • 国际化域名与 URL
    • 持久化 Cookie 会话
    • 自动内容解码(JSON、文本、二进制)
    • SSL 认证、代理支持、文件分块上传
    • 超时控制、异常处理

🔎2. 基础请求方式

🦋2.1 GET 请求

示例:不带参数的 GET 请求

import requests    # 导入网络请求模块requests

# 发送网络请求
response = requests.get('https://www.baidu.com')
print('响应状态码为:',response.status_code)  # 打印状态码
print('请求的网络地址为:',response.url)          # 打印请求url
print('头部信息为:',response.headers)      # 打印头部信息
print('cookie信息为:',response.cookies)      # 打印cookie信息
在这里插入图片描述在这里插入图片描述

示例:处理响应编码(UTF-8)

import requests    # 导入网络请求模块requests

# 发送网络请求
response = requests.get('https://www.baidu.com/')
response.encoding='utf-8'    # 对响应结果进行utf-8编码
print(response.text)         # 以文本形式打印网页源码
在这里插入图片描述在这里插入图片描述

示例:下载二进制文件(如图片)

import requests    # 导入网络请求模块requests

# 发送网络请求
response = requests.get('https://www.baidu.com/img/bd_logo1.png?where=super')
print(response.content)                # 打印二进制数据
with open('百度logo.png','wb')as f:   # 通过open函数将二进制数据写入本地文件
    f.write(response.content)          # 写入

在这里插入图片描述 在这里插入图片描述

示例:带参数的 GET 请求

# 直接在 URL 中拼接参数
response = requests.get('http://httpbin.org/get?name=Jack&age=30')

# 使用 params 参数传递字典
data = {'name': 'Michael', 'age': '36'}
response = requests.get('http://httpbin.org/get', params=data)
print(response.text)  # 显示参数在 args 字段中

🦋2.2 POST 请求

示例:发送表单数据

import requests    # 导入网络请求模块requests
import json        # 导入json模块

# 字典类型的表单参数
data = {'1': '能力是有限的,而努力是无限的。',
        '2':'星光不问赶路人,时光不负有心人。'}
# 发送网络请求
response = requests.post('http://httpbin.org/post',data=data)
response_dict = json.loads(response.text)      # 将响应数据转换为字典类型
print(response_dict)                             # 打印转换后的响应数据
在这里插入图片描述在这里插入图片描述

🔎3. 复杂请求处理

🦋3.1 添加请求头

示例:模拟浏览器请求头

import requests    # 导入网络请求模块requests

url = 'https://www.baidu.com/'     # 创建需要爬取网页的地址
# 创建头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}
response  = requests.get(url, headers=headers)    # 发送网络请求
print(response.status_code)                       # 打印响应状态码
在这里插入图片描述在这里插入图片描述

🦋3.2 处理 Cookies

在爬取某些数据时,需要进行网页的登录,才可以进行数据的抓取工作。Cookies登录就像很多网页中的自动登录功能一样,可以让用户在第二次登录时,在不需要验证账号和密码的情况下进行登录。在使用requests模块实现Cookies登录时,首先需要在浏览器的开发者工具页面中找到可以实现登录的Cookies信息,然后将Cookies信息处理并添加至RequestsCookieJar的对象中,最后将RequestsCookieJar对象作为网络请求的Cookies参数,发送网络请求即可。以获取豆网页登录后的用户名为例,具体步骤如下。

(1)在谷歌浏览器中打开豆瓣网页地址(https://www.douban.com/),然后按F12键打开网络监视器,选择“密码登录”输入“手机号/邮箱”与“密码”,然后单击“登录豆瓣”,网络监视器将显示如图所示的数据变化。

在这里插入图片描述 (2)在Headers选项中选中Request Headers选项,获取登录后的Cookie信息,如图所示。 在这里插入图片描述 (3)导入相应的模块,将“找到登录后网页中的Cookie信息”以字符串形式保存,然后创建RequestsCookieJar()对象并对Cookie信息进行处理,最后将处理后的RequestsCookieJar()对象作为网络请求参数,实现网页的登录请求。代码如下:

import requests  # 导入网络请求模块
from lxml import etree  # 导入lxml模块

cookies = '此处填写登录后网页中的cookie信息'
headers = {'Host': 'www.douban.com',
           'Referer': 'https://www.hao123.com/',
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/72.0.3626.121 Safari/537.36'}
# 创建RequestsCookieJar对象,用于设置cookies信息
cookies_jar = requests.cookies.RequestsCookieJar()
for cookie in cookies.split(';'):
    key, value = cookie.split('=', 1)
    cookies_jar.set(key, value)  # 将cookies保存RequestsCookieJar当中
# 发送网络请求
response = requests.get('https://www.douban.com/',
headers=headers, cookies=cookies_jar)
if response.status_code == 200:  # 请求成功时
    html = etree.HTML(response.text)  # 解析html代码
    # 获取用户名
    name = html.xpath('//*[@id="db-global-nav"]/div/div[1]/ul/li[2]/a/span[1]/text()')
    print(name[0])  # 打印用户名

🦋3.3 会话管理

示例:使用 Session 保持登录状态

import requests        # 导入requests模块
s = requests.Session()  # 创建会话对象
data={'username': 'mrsoft', 'password': 'mrsoft'}  # 创建用户名、密码的表单数据
# 发送登录请求
response =s.post('http://site2.rjkflm.com:666/index/index/chklogin.html',data=data)
response2=s.get('http://site2.rjkflm.com:666')   # 发送登录后页面请求
print('登录信息:',response.text)                # 打印登录信息
print('登录后页面信息如下:\n',response2.text)    # 打印登录后的页面信息

🦋3.4 身份验证

在这里插入图片描述在这里插入图片描述

示例:HTTP 基础认证

import requests          # 导入requests模块
from requests.auth import HTTPBasicAuth  # 导入HTTPBasicAuth类
# 定义请求地址
url = 'http://sck.rjkflm.com:666/spider/auth/'
ah = HTTPBasicAuth('admin','admin')      # 创建HTTPBasicAuth对象,参数为用户名与密码
response = requests.get(url=url,auth=ah) # 发送网络请求
if response.status_code==200:            # 如果请求成功
    print(response.text)                 # 打印验证后的HTML代码

🦋3.5 处理超时与异常

示例:设置超时并捕获异常

import requests     # 导入网络请求模块
# 循环发送请求50次
for a in range(0, 50):
    try:    # 捕获异常
        # 设置超时为0.5秒
        response = requests.get('https://www.baidu.com/', timeout=0.1)
        print(response.status_code)                                        # 打印状态码
    except Exception as e:                                                 # 捕获异常
        print('异常'+str(e))                                                # 打印异常信息

示例:网络异常分类

import requests  # 导入网络请求模块
# 导入requests.exceptions模块中的三种异常类
from requests.exceptions import ReadTimeout,HTTPError,RequestException
# 循环发送请求50次
for a in range(0, 50):
    try:    # 捕获异常
        # 设置超时为0.5秒
        response = requests.get('https://www.baidu.com/', timeout=0.1)
        print(response.status_code)                                        # 打印状态码
    except ReadTimeout:                                                     # 超时异常
        print('timeout')
    except HTTPError:                                                       # HTTP异常
        print('httperror')
    except RequestException:                                               # 请求异常
        print('reqerror')

🦋3.6 上传文件

示例:上传图片文件

import requests                   # 导入网络请求模块
bd = open('百度logo.png','rb')     # 读取指定文件
file = {'file':bd}                 # 定义需要上传的图片文件
# 发送上传文件的网络请求
response = requests.post('http://httpbin.org/post',files = file)
print(response.text)               # 打印响应结果
在这里插入图片描述在这里插入图片描述

🔎4. 代理服务

🦋4.1 使用代理发送请求

示例:设置代理 IP

import requests      # 导入网络请求模块
# 头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/72.0.3626.121 Safari/537.36'}
proxy = {'http': 'http://117.88.176.38:3000',
         'https': 'https://117.88.176.38:3000'}  # 设置代理ip与对应的端口号
try:
    # 对需要爬取的网页发送请求,verify=False不验证服务器的SSL证书
    response = requests.get('http://2020.ip138.com', headers= headers,proxies=proxy,verify=False,timeout=3)
    print(response.status_code)  # 打印响应状态码
except Exception as e:
    print('错误异常信息为:',e)    # 打印异常信息

🦋4.2 获取与检测代理 IP

示例:爬取免费代理 IP

import requests  # 导入网络请求模块
from lxml import etree  # 导入HTML解析模块
import pandas as pd  # 导入pandas模块

# 头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/72.0.3626.121 Safari/537.36'}
# 发送网络请求
response = requests.get('https://www.xicidaili.com/nn/', headers=headers)
response.encoding = 'utf-8'  # 设置编码方式
if response.status_code == 200:  # 判断请求是否成功
    html = etree.HTML(response.text)  # 解析HTML
    table = html.xpath('//table[@id="ip_list"]')[0]  # 获取table标签内容
    trs = table.xpath('//tr')[1:]  # 获取所有tr标签,排除第一条
    ip_table = pd.DataFrame(columns=['ip'])      # 创建临时表格数据
    ip_list = []       # 创建保存ip地址的列表
    # 循环遍历标签内容
    for t in trs:
        ip = t.xpath('td/text()')[0]  # 获取代理ip
        port = t.xpath('td/text()')[1]  # 获取端口
        ip_list.append(ip+':'+port)     # 将ip与端口组合并添加至列表当中
        print('代理ip为:', ip, '对应端口为:', port)
    ip_table['ip']=ip_list              # 将提取的ip保存至excel文件中的ip列
    # 生成xlsx文件
    ip_table.to_excel('ip.xlsx', sheet_name='data')

示例:检测代理 IP 有效性

import requests  # 导入网络请求模块
import pandas    # 导入pandas模块
from lxml import etree  # 导入HTML解析模块

ip_table = pandas.read_excel('ip.xlsx')  # 读取代理IP文件内容
ip = ip_table['ip']                      # 获取代理ip列信息
# 头部信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/72.0.3626.121 Safari/537.36'}
# 循环遍历代理IP并通过代理发送网络请求
for i in ip:
    proxies = {'http': 'http://{ip}'.format(ip=i),
               'https': 'https://{ip}'.format(ip=i)}
    try:
        # verify=False不验证服务器的SSL证书
        response = requests.get('http://2020.ip138.com/',
                                headers=headers,proxies=proxies,verify=False,timeout=2)
        if response.status_code==200:   # 判断请求是否成功,请求成功说明代理IP可用
            response.encoding='utf-8'     # 进行编码
            html = etree.HTML(response.text)  # 解析HTML
            info = html.xpath('/html/body/p[1]/text()')
            print(info[0].strip())                 # 输出当前ip匿名信息
    except Exception as e:
        pass
        # print('错误异常信息为:',e)    # 打印异常信息
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。