Python Requests 基本使用及Requests与 urllib 区别
作者:卡尔特斯 发布时间:2023-04-07 17:58:11
标签:Python,Requests,urllib
一、简介
Python
内置了 requests
模块,该模块主要用来发送 HTTP
请求,requests
模块比 urllib 模块更简洁。
Requests 官方文档、Requests 中文文档
安装
$ pip install requests
附:urllib 入门使用(步骤详细) 用于对比区别。
二、基本使用
# 导入
import requests
# 请求地址
url = "https://www.baidu.com"
# 获取服务器响应数据
response = requests.get(url=url)
# 1 个类型和 6 个属性
# 1、响应数据类型(urllib 的响应数据类型是 http.client.HTTPResponse)
print(type(response)) # requests.models.Response
# 2、设置响应的编码格式
response.encoding = 'utf-8'
# 3、以字符串的形式返回网页的源码
print(response.text)
# 4、返回 url 地址
print(response.url)
# 5、返回二进制的数据(text 的二进制数据,urllib 的 response.read() 就是二进制数据)
print(response.content)
# 6、返回响应的状态码
print(response.status_code)
# 7、返回响应头信息
print(response.headers)
三、GET 请求与 urllib 区别
# 导入
import requests
# 请求地址
# url = "https://www.baidu.com/s?"
url = "https://www.baidu.com/s"
# 请求头
headers = {
'Accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',
# 'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Cookie': '填自己的 Cookie,没有会拿不到数据',
'Host': 'www.baidu.com',
'Referer': 'https://www.baidu.com/s?wd=%E5%8C%97%E4%BA%AC&rsv_spt=1&rsv_iqid=0xc4323e2d0000fc1a&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&oq=%25E5%258C%2597%25E4%25BA%25AC&rsv_btype=t&rsv_t=009fICC65EzpN%2BM16VRnKfYWv8Pm6F%2BO1r55ft99%2BL0OlRVHYYfi5cpRa1wOl%2Bhe0bQO&rsv_pq=f70437990000a294&prefixsug=%25E5%258C%2597%25E4%25BA%25AC&rsp=0',
'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
# 参数
data = {
'wd': '北京'
}
# 获取服务器响应数据【def get(url, params=None, **kwargs)】
# url: 请求地址
# params: 参数
# kwargs: 字典
response = requests.get(url=url, params=data, headers=headers)
# 设置响应数据编码格式
response.encoding = 'utf-8'
# 获取页面内容
print(response.text)
# 总结:
# 1、参数使用 params 传递
# 2、无需像 urllib 使用 urllib.parse.urlencode() 编码,可以直接传入
# 3、不需要请求对象的定制
# 4、请求资源路径中的 ?可以加也可以不加
# url = "https://www.baidu.com/s?"
# url = "https://www.baidu.com/s"
四、POST 请求与 urllib 区别
# 导入
import requests
# 请求地址
url = "https://fanyi.baidu.com/sug"
# 请求头
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': '21',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': '填自己的 Cookie,没有会拿不到数据',
'Host': 'fanyi.baidu.com',
'Origin': 'https://fanyi.baidu.com',
'Referer': 'https://fanyi.baidu.com/',
'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
# 参数
data = {
'kw': '眼睛'
}
# 获取服务器响应数据【def post(url, data=None, json=None, **kwargs)】
# url: 请求地址
# data: 参数
# kwargs: 字典
response = requests.post(url=url, data=data, headers=headers)
# 设置响应数据编码格式
response.encoding = 'utf-8'
# 获取页面内容
print(response.text)
# 总结:
# 1、post 请求不需要编解码(urllib.parse.urlencode(params).encode('utf-8'))
# 2、post 请求的参数是 data,get 请求参数是 params
# 3、不需要请求对象的定制
五、IP代理
# 导入
import requests
# 请求地址
# url = "https://www.baidu.com/s?"
# url = "https://www.baidu.com/s"
url = "http://www.baidu.com/s"
# 请求头
headers = {
'Accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',
# 'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Cookie': '填自己的 Cookie,没有会拿不到数据',
'Host': 'www.baidu.com',
'Referer': 'https://www.baidu.com/s?wd=%E5%8C%97%E4%BA%AC&rsv_spt=1&rsv_iqid=0xc4323e2d0000fc1a&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&oq=%25E5%258C%2597%25E4%25BA%25AC&rsv_btype=t&rsv_t=009fICC65EzpN%2BM16VRnKfYWv8Pm6F%2BO1r55ft99%2BL0OlRVHYYfi5cpRa1wOl%2Bhe0bQO&rsv_pq=f70437990000a294&prefixsug=%25E5%258C%2597%25E4%25BA%25AC&rsp=0',
'sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
# 参数
data = {
'wd': 'ip'
}
# 代理
proxys = {
# 前面的 http 协议最好跟 请求地址 的协议保持一致,有时候会出问题
# 'http': '222.74.73.202:42055'
}
# 获取服务器响应数据【def get(url, params=None, **kwargs)】
# url: 请求地址
# params: 参数
# kwargs: 字典
response = requests.get(url=url, params=data, headers=headers, proxies=proxys)
# 设置响应数据编码格式
response.encoding = 'utf-8'
# 获取页面内容
# print(response.text)
# 存储到文件夹
with open('dali.html', 'w', encoding='utf-8') as f:
f.write(response.text)
六、验证码案例
通过 古诗文网 作为测试
# 登录接口需要的参数:
# __VIEWSTATE: ySbbXPOgH0tbN+MZqd0YtuJiFM8uIhBDD9pK/q4dqPvGLwWIbW799+Hr7aDPNHZpg27Nxe259UePM3z1Rc2X89uauZJQEkkrcyVULG09iqo38jAnG6zaq5D6a2/ZhOx7HIPakzBHk5K6JRQ2kGMtIfN0Qjs=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: xxxx
# pwd: xxxx
# code: TJ83
# denglu: 登录
# 观察到 __VIEWSTATE 与 __VIEWSTATEGENERATOR 不知道如何获取?
# 一般情况下,看不到的数据,都是在页面源码中,弄一个不可见的元素赋值,所有可以进入源码中,搜索试试
# 导入
import requests
from lxml import etree
# 请求地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
# 请求头
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# 获取页面数据
response = requests.get(url=url, headers=headers)
# 然后可以在内容中搜搜 __VIEWSTATE 与 __VIEWSTATEGENERATOR,以免做了反扒
# print(response.text)
# 设置响应数据编码
response.encoding = 'utf-8'
# 解析服务器响应数据
tree = etree.HTML(response.text)
# 获取 __VIEWSTATE 值
VIEWSTATE = tree.xpath('//input[@id="__VIEWSTATE"]/@value')[0]
# 获取 __VIEWSTATEGENERATOR 值
VIEWSTATEGENERATOR = tree.xpath('//input[@id="__VIEWSTATEGENERATOR"]/@value')[0]
# 获取验证码
code = tree.xpath('//img[@id="imgCode"]/@src')[0]
code_url = 'https://so.gushiwen.cn' + code
# 将验证码图片下载到本地,但是不能使用 urllib.request.urlretrieve() 去下载,下载就会导致切换验证码了,保存的也就变成旧的了
# 解决方法:requests 里面有个 session(),能够跨请求地保持某些参数,说白了,就是比如使用 session 成功的登录了某个网站,则再次使用该 session 对象对该网站的其他网页访问时都会默认使用该 session 之前使用的 cookie 等参数
session = requests.session()
# 获取验证码内容
response_code = session.get(code_url)
# 注意此时要使用二进制数据,因为要下载图片
content_code = response_code.content
# 将二进制数据写入到文件(有时候会有延迟,反应没那么快,编辑器没有出现,可以直接进入文件看看)
with open('code.jpg', 'wb') as f:
f.write(content_code)
# 识别验证码的库网上很多,搜搜
来源:https://blog.csdn.net/zz00008888/article/details/127909343


猜你喜欢
- 1、使用del语句删除元素>>> i1 = ["a",'b','c',
- 在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器、迭代器和生成器理解进行
- python 定时器默认定时器只执行一次,第一个参数单位S,几秒后执行import threadingdef fun_timer(): pr
- 目录系列教程一、用户管理1、用户账号2、增加删除账号3、破解管理账号密码二、授权管理1、授权2、查询授权3、收回授权总结系列教程MySQL系
- 第一步,建立一个CPP的DLL工程,然后写如下代码,生成DLL#include <stdio.h> &nb
- Ctrl+N 按文件名搜索py文件ctrl+n可以搜索py文件勾选上面这个框可以搜索工程以外的文件Ctrl+shift+N 按文件名搜索所有
- 一、假如训练集表现不好1.尝试新的激活函数ReLU:Rectified Linear Unit图像如下图所示:当z<0时,a = 0,
- 前言昨天主管突然给我说微信小程序默认的 tabBar 不美观,让我改成中间突出的那种样式。纵然我心里面有千般不情愿,但还是接下了这个任务。查
- selenium IDE是干什么的Selenium IDE 是一个简单的录制回放工具,它可以录制你在浏览器上的操作,回放脚本时
- 代码import requestsimport timefrom tqdm import tqdmfrom bs4 import Beaut
- 有个朋友要求帮忙绘制堆叠柱状图,查阅了一些文档之后也算是完成了,只是一个小demo,下面我就记录一下。1.什么是堆叠柱状图与并排显示分类的分
- python字符串,元组,列表,字典互相转换直接给大家上代码实例#-*-coding:utf-8-*- #1、字典dict = {'
- 在使用Python做脚本的话,有两个库可以使用,一个为PyUserInput库,另一个为pyautogui库。就本人而言,我更喜欢使用pya
- 很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---
- 上一课:ACCESS入门教程:初识Access 2000窗口接口简介 通过上一课的学习,你是否感觉Access的窗口和接口还有点搞不清楚,对
- 前言在开发中一些需求需要通过程序操作excel文档,例如导出excel、导入excel、向excel文档中插入图片、表格和图表等信息,使用E
- 在命令行中输入命令并不是一个好主意,会造成安全问题。但是如果你决定去写一个应用,而这个应用需要在命令行中使用密码或者其他敏感信息。那么,你能
- 本文实例讲解了JavaScript实现简单的tab选项卡切换的示例代码,分享给大家供大家参考,具体内容如下效果图:具体代码:<!DOC
- XML Web Service 是在 Internet 上进行分布式计算的基本构造块。开放的标准以及对用户和应用程序之间的通信和协作的关注产
- 以前装过sql server,后来删掉。现在重装,却出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动