Python Requests 基本使用及Requests与 urllib 区别

 更新时间:2022年11月18日 11:13:33   作者:卡尔特斯  
在使用Python爬虫时,需要模拟发起网络请求,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装,今天通过本文给大家讲解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)

# 识别验证码的库网上很多,搜搜

到此这篇关于Python Requests 基本使用(与 urllib 的区别)的文章就介绍到这了,更多相关Python Requests 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python 中pyqt5 树节点点击实现多窗口切换问题

    python 中pyqt5 树节点点击实现多窗口切换问题

    这篇文章主要介绍了python 中pyqt5 树节点点击实现多窗口切换问题,文中给大家介绍了python pyqt5 点击按钮来打开另一个窗口的方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴借鉴价值,需要的朋友可以参考下
    2019-07-07
  • python使用sqlite3时游标使用方法

    python使用sqlite3时游标使用方法

    这篇文章主要为大家详细介绍了python使用sqlite3时游标的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 详解python上传文件和字符到PHP服务器

    详解python上传文件和字符到PHP服务器

    本篇内容主要给大家介绍了在python中上传字符或者文件到PHP服务器的相关实现代码,如果你正好用得到,一起学习下。
    2017-11-11
  • Python中的Popen函数demo演示

    Python中的Popen函数demo演示

    在Python的subprocess模块中,Popen函数用于创建子进程并与之通信,相较于os.system(),Popen提供了更多灵活性,如可捕获子进程的标准输出和错误,exe_path参数用于指定要执行的文件或命令,本文给大家介绍Python中的Popen函数,感兴趣的朋友一起看看吧
    2024-09-09
  • 使用Python进行大规模数据处理和分析

    使用Python进行大规模数据处理和分析

    大规模数据处理和分析旨在从海量数据中提取有用的信息和见解,以支持决策制定和业务发展,Python凭借其丰富的生态系统和强大的库,为处理和分析数据提供了丰富的工具和资源,在本文中,我们将深入探讨如何利用Python进行大规模数据处理和分析,需要的朋友可以参考下
    2024-05-05
  • 使用Python实现文本转语音(TTS)并播放音频

    使用Python实现文本转语音(TTS)并播放音频

    在开发涉及语音交互或需要语音提示的应用时,文本转语音(TTS)技术是一个非常实用的工具,下面我们来看看如何使用gTTS和playsound库将文本转换为语音并播放音频文件吧
    2025-03-03
  • python绘制散点图详细步骤(从0到1必会)

    python绘制散点图详细步骤(从0到1必会)

    这篇文章主要介绍了如何使用Python绘制散点图,包括导入包、准备数据、绘制图像、修饰图像(添加标题、坐标轴标签、颜色图例)以及整合所有代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • 解决pycharm下os.system执行命令返回有中文乱码的问题

    解决pycharm下os.system执行命令返回有中文乱码的问题

    今天小编就为大家分享一篇解决pycharm下os.system执行命令返回有中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • IntelliJ 中配置 Anaconda的过程图解

    IntelliJ 中配置 Anaconda的过程图解

    这篇文章主要介绍了IntelliJ 中配置 Anaconda过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 使用python对多个txt文件中的数据进行筛选的方法

    使用python对多个txt文件中的数据进行筛选的方法

    今天小编就为大家分享一篇使用python对多个txt文件中的数据进行筛选的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论