Python爬虫基础之Requests详解

目录

  • 1. 简介
  • 2. 安装
  • 3. 发送请求
  • 4. 处理响应
  • 5. IP代理
  • 6. Cookie登录
  • 参考文献

原文地址:https://program-park.top/2023/10/27/reptile_4/

本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。

1. 简介

  Requests 是用 Python 编写,基于 urllib,采用 Apache2 Licensed 开源协议认证的 HTTP 库。它支持 HTTP 连接保持和连接池、cookie 保持会话、文件上传、自动响应内容编码,以及国际化的 URL 和 POST 数据自动编码等,比 urllib 更加方便简洁,在日常开发中可以节约我们大量的时间。
  这是 Requests 官网的描述:

  • 官方文档:
    • https://requests.readthedocs.io/projects/cn/zh_CN/latest/
  • 快速上手:
    • https://requests.readthedocs.io/projects/cn/zh_CN/latest/user/quickstart.html

2. 安装

  因为是第三方库,所以我们需要使用 pip 下载:

pip install requests

  使用时直接导入 requests 模块即可:

import requests

3. 发送请求

  首先,我们先从最简单的 HTTP 请求开始,发送一个 GET 请求到指定的 URL,获取响应数据:

import requestsurl = 'https://www.baidu.com/s'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}
data = {'wd': '北京'
}
response = requests.get(url = url, headers=headers, params=data)
print(response.text)

  除了发送 GET 请求,我们还可以发送其他类型的请求,例如 POST 请求:

import requestsurl = 'http://fanyi.baidu.com/sug'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}
data = {'kv': 'eye'
}
response = requests.post(url=url, headers=headers, data=data)
print(response.text)

  这里需要注意的是,Get 请求的参数名字是params,Post 请求的参数名字是data
  我们正常在发送请求时,会带上一些请求参数,比如 params、data、json、files、timeout、headers、cookies 等等,下面是常用参数的具体说明:

参数释义示例
url请求的 URL 地址,必选参数url=http://program-park.top
paramsurl 请求的参数(dict 字典),一般用于 get 请求,post 请求也可用params={‘key1’:‘value1’, ‘key2’:‘value2’}
datapost 请求的参数,字典(dict) 或文件类对象(file-like object)data={‘key1’:‘value1’, ‘key2’:‘value2’}
jsonpost 请求的 json 参数json={‘key1’:‘value1’, ‘key2’:‘value2’}
filespost 请求文件流数据,字典上传files={‘file’:open(‘report.xls’, ‘rb’)} 或 files={‘file’: (‘report.xls’, open(‘report.xls’, ‘rb’), ‘application/vnd.ms-excel’, {‘Expires’:‘0’})}
timeout请求响应的最长等待时间。默认 Nonetimeout=5
headershttp 请求头(HTTP Headers)信息headers={‘user-agent’:‘my-app/0.0.1’}
cookies字典 dict 或 cookie 对象cookie={‘cookie_are’:“working”}
verify默认 True,为 False 时忽略对 SSL 证书的验证,还可以接收 SSL 证书的路径,为会话加载 SSL 证书。verify=False
cert指定一个班底证书用作客户端证书,可以是单个文件或一个包含两个文件路径的元组,本地的私有 key 必须是解密状态cert=(‘/path/client.cert’, ‘/path/client.key’) 或 cert=(‘/path/client.pem’)
authHTTP 验证信息from requests.auth import HTTPBasicAuth
auth = HTTPBasicAuth()

  当然,Requests 支持的请求方式不只这两种:

requests.post('')
requests.put('')
requests.delete('')
requests.head('')
requests.options('')

4. 处理响应

  说完发送请求的相关知识点,下面就是接收到响应后如何做处理了,Requests 库提供了丰富的方法来处理响应数据:

属性或方法说明
apparent_encoding编码方式
close()关闭与服务器的连接
content返回响应的内容,以字节为单位
cookies返回一个 CookieJar 对象,包含了从服务器发回的 cookie
elapsed返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。
encoding解码 r.text 的编码方式
headers返回响应头,字典格式
history返回包含请求历史的响应对象列表(url)
is_permanent_redirect如果响应是永久重定向的 url,则返回 True,否则返回 False
is_redirect如果响应被重定向,则返回 True,否则返回 False
iter_content()迭代响应
iter_lines()迭代响应的行
json()返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误)
links返回响应的解析头链接
next返回重定向链中下一个请求的 PreparedRequest 对象
ok检查 “status_code” 的值,如果小于400,则返回 True,如果不小于 400,则返回 False
raise_for_status()如果发生错误,方法返回一个 HTTPError 对象
reason响应状态的描述,比如 “Not Found” 或 “OK”
request返回请求此响应的请求对象
status_code返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found)
text返回响应的内容,unicode 类型数据
url返回响应的 URL

  这里我就不做演示了,都是些很基础的方法,上手一试便知。

5. IP代理

  Requests 基础的发送请求、处理响应说完之后,还需讲一下如何使用代理 IP 来发送请求,这个之前在 urllib 的教程中也说过,就直接上代码了,在快代理(https://www.kuaidaili.com/free/)白嫖个能用的代理做个示例:

import requestsurl = 'http://www.baidu.com/s?'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}
data = {'wd': 'ip'
}
proxy = {'http': 'http://101.200.185.203:16816'
}
response = requests.get(url=url, headers=headers, params=data, proxies=proxy)
content = response.text
with open('daili.html', 'w', encoding='utf-8') as fp:fp.write(content)

6. Cookie登录

  Cookie 是一种保存在电脑上的一种文件,当我们使用电脑进行浏览网页的时候,服务器就会生成一个证书,并且返回给我们的电脑,这个证书就是 Cookie,一般情况下,Cookie 是服务器写入客户端的文件,我们也可以叫浏览器缓存。
  一般情况下,网站是通过 Cookie 对请求进行保存,会根据用户进行特定的内容进行展示,也可以对密码进行存储,Cookie 文件是以浏览器为载体,并且有浏览器为支撑,我们可以在浏览器中设置阻止,这样的话,服务器就不能写进 Cookie,现在很多浏览器都是能支持 Cookie,不过有些时候,网站访问不支持 Cookie 的话,会出现浏览器不能访问的情况。
  这里结合登录古诗文网(https://www.gushiwen.cn/)的案例来讲解如何使用 Requests 实现 Cookie 登录。使用 Requests 处理 Cookie 有三种方法:

  • Cookie 字符串放在 headers 中;
  • Cookie 字典放在请求方法requests.get()中作为参数接收;
  • 使用 Requests 提供的 session() 方法。

  我这里就只讲解第三个方法,因为前两个都需要手动添加 Cookie,一般企业开发用不到。Requests 提供了一个叫session()的方法,来实现客户端和服务端的会话保持,会话保持主要作用是保存 Cookie,下次请求会带上上次的 Cookie,以及实现和服务端的长连接,加快请求速度。使用方法:

session = requests.session()
response = session.get(url,headers)

  那么话不多说,直接上案例代码:

import requests# 古诗文官网的登录地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.102 Safari/537.36 Edg/104.0.1293.63'
}# 获取页面源码
response = requests.get(url=url, headers=headers)
content = response.text# 解析页面源码,获取__VIEWSTATE和__VIEWSTATEGENERATOR
from bs4 import BeautifulSoupsoup = BeautifulSoup(content, 'lxml')# 获取__VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code# 会话保持
seeion = requests.session()
# 验证码的url内容
response_code = seeion.get(code_url)
content_code = response_code.contentwith open('code.jpg', 'wb') as fp:fp.write(content_code)# 获取验证码后保存到本地,观察验证码后输入
code_name = input('输入验证码:')# 点击登录
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {'__VIEWSTATE': viewstate,'__VIEWSTATEGENERATOR': viewstategenerator,'from': 'http://so.gushiwen.cn/user/collect.aspx','email': 'lkm869666@126.com','pwd': 'XXXXXX','code': code_name,'denglu': '登录'
}response_post = seeion.post(url=url, headers=headers, data=data_post)
content_post = response_post.textwith open('gushiwen.html', 'w', encoding='utf-8') as fp:fp.write(content_post)

  观察上面的案例可以发现,在登录过程中,有一个图片验证码需要输入,我们这里是将图片保存到本地,手动输入图片的验证码接着再登录。其实在实际的企业开发中,这一步也是需要我们自动化去完成的,一般都是结合一些第三方打码平台(一般都是收费的)来调用接口,自动输入验证码。比如超级鹰(https://www.chaojiying.com/),这里会有自己的开发文档,里面有各个语言的 Demo,这个我就不详细说了,官网都是傻瓜式教程。

参考文献

  【1】https://requests.readthedocs.io/projects/cn/zh_CN/latest/
  【2】https://requests.readthedocs.io/projects/cn/zh_CN/latest/user/quickstart.html
  【3】https://cloud.tencent.com/developer/article/2345961
  【4】https://zhuanlan.zhihu.com/p/366457854
  【5】https://blog.csdn.net/ctrlthh/article/details/133820373
  【6】https://www.runoob.com/python3/python-requests.html
  【7】https://www.cnblogs.com/lanyinhao/p/9634742.html
  【8】https://zhuanlan.zhihu.com/p/137649301
  【9】https://zhuanlan.zhihu.com/p/33288426
  【10】https://www.bilibili.com/video/BV1Db4y1m7Ho?p=84
  【11】https://www.php.cn/faq/413706.html
  【12】https://blog.51cto.com/u_14691/6678457

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/151924.html

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

相关文章

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅&…

Android [SPI,AutoSerivce,ServiceLoader]

记录一下在Android中使用SPI的过程。 1.项目gralde文件。 plugins {id kotlin-kapt } dependencies {implementation com.google.auto.service:auto-service:1.0-rc7 kapt "com.google.auto.service:auto-service:1.0-rc7" } 这个AutoServ…

基于51单片机的温度测量报警系统的设计与制作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、实习目的二、实习任务2.1 设计温度测量报警系统硬件电路2.2 温度测量报警系统软件编程、仿真与调试;2.3 完成温度测量报警系统的实物制作与调试…

LVS-DR模式+keepalived+nginx+tomcat实现动静分离、负载均衡、高可用实验

实验条件: test2——20.0.0.20——主服务器——ipvsadm、keepalived服务 test3——20.0.0.30——备服务器——ipvsadm、keepalived服务 nginx5——20.0.0.51——后端真实服务器1(tomcat的代理服务器)——nginx服务 nginx6——20.0.0.61—…

NNDL:作业五

习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明: 激活函数以sigmoid为例。 神经元:有两层,线性层和激活层:yw*xb,然后y‘sigmoid(y),也就是。 梯度…

C++ string 类的其他操作

4.3.2 string 类的其他操作 在C新增string类之前,程序员也需要完成诸如给字符串赋值等工作。对于C语言式的字符串,程 序员使用C语言库中的函数来完成这些任务。头文件cstring(以前为string.h)提供了这些函数。例如,可 以使用函数 strcpy()将字符串复制到字符数组中,使用函数…

【RTOS学习】软件定时器 | 中断处理

🐱作者:一只大喵咪1201 🐱专栏:《RTOS学习》 🔥格言:你只管努力,剩下的交给时间! 软件定时器 | 中断处理 🏀软件定时器⚽守护任务守护任务的调度 ⚽使用软件定时器的函数…

在Go项目中二次封装Kafka客户端功能

1.摘要 在上一章节中,我利用Docker快速搭建了一个Kafka服务,并测试成功Kafka生产者和消费者功能,本章内容尝试在Go项目中对Kafka服务进行封装调用, 实现从Kafka自动接收消息并消费。 在本文中使用了Kafka的一个高性能开源库Sarama, Sarama是一个遵循MIT许可协议的Apache Kafk…

【MySQL】并发事务产生的问题及事务隔离级别

先来复习一下事务的四大特性: 原子性(Atomicity):事务是不可分割的最小操作单位,事务中的所有操作要么全部执行成功,要么全部失败回滚,不能只执行其中一部分操作。一致性(Consisten…

排序算法-堆积树排序法(HeapSort)

目录 排序算法-堆积树排序法(HeapSort) 1、说明 2、算法分析 3、C代码 排序算法-堆积树排序法(HeapSort) 1、说明 堆积树排序法是选择排序法的改进版,可以减少在选择排序法中的比较次数,进而减少排序…

hdlbits系列verilog解答(模块按位置)-21

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 此问题类似于上一个(模块)。您将获得一个名为的 mod_a 模块,该模块按此顺序具有 2 个输出和 4 个输入。您必须按位置将 6 个端口按该顺序连接到顶级模块的端口 out1 、 out2…

pycharm 2023.2.3设置conda虚拟环境

分两步: (1)设置Virtualenv Environment (2)设值Conda Executable 加载conda环境,然后选择conda环境