python-day03-网络请求模块一

57 阅读8分钟

3.jpg

urllib模块

urllib了解

urllib 库 是 Python 内置的 HTTP 请求库。urllib 模块提供的上层接口,使访问 www 和 ftp 上的数据就像访问本地文件一样。 有以下几种模块:

  • urllib.request 请求模块
  • urllib.error 异常处理模块
  • urllib.parse url解析模块
  • urllib.robotparser robots.txt 解析模块

urllib.request模块详讲

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。

常用的方法

  • urllib.request.urlopen("网址"/"请求对象")  作用 :向网站发起一个请求并获取响应 urlopen()不支持重构User-Agent
  • read()  读取服务器响应的内容
  • 字节流 = response.read()
  • 字符串 = response.read().decode("utf-8")
  • getcode() 返回HTTP的响应码
  • geturl()  返回实际数据的URL(防止重定向问题)
  • urllib.request.Request("网址",headers="字典")

urllib.request.urlopen("网址"/"请求对象")实例

import urllib.request
# 目标url
url = "http://www.baidu.com"
# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
# 发起请求
response = urllib.request.urlopen(url)
"""Open the URL url, which can be either a string or a Request object
参数我们不仅可以传入一个网址 也可以传入一个对象 
"""
# 获取响应
# html = response.read()  # 获取字节流
html = response.read().decode('utf-8')  # 获取字符串
# print(html)print(response.getcode())  # 返回HTTP的响应码
print(response.geturl())   # 返回实际数据的URL

urllib.request.Request("网址","请求头")实例

由上我们知道利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。

import urllib.request
# urllib.request.Request()
# 创建请求对象并构建User-Agent
​
url = "http://www.baidu.com"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
​
# 1 创建请求对象并构建User-Agent
req = urllib.request.Request(url, headers=headers)
print(req)  # <urllib.request.Request object at 0x000001B411D38048> 请求对象
# 2获取响应对象  urlopen
"""我们依然是用urlopen()方法来发送这个请求,只不过这次urlopen()方法的参数不再是一个URL,
而是一个Request,通过构造这个这个数据结构,
一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。"""
response = urllib.request.urlopen(req)
# 3读取响应对象的内容  read().decode("utf-8")
html = response.read().decode("utf-8")
print(html)

urllib.parse模块详讲

常用方法

  • urlencode(字典)
  • quote(字符串) (这个里面的参数是个字符串)

urlencode与quote实战

# 网络模块在向一个携带一个中文字样的url发送请求就会出现问题
# 解决方案: 把中文处理成%+十六进制的样式import urllib.request
import urllib.parse
​
url1 = "https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B"
url2 = "https://www.baidu.com/s?wd=海贼王"
url3 = "https://www.baidu.com/s?wd=python"
​
req = urllib.request.urlopen(url1)
print(req)  # UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)# 第一种方法
'''
urlencode
传入参数类型:字典
功能:将存入的字典参数编码为URL查询字符串,即转换成以key1=value1&key2=value2的形式
导入:from urllib.parse import urlencode
'''
r = {"wd": "海贼王"}
result = urllib.parse.urlencode(r)  # 对r进行解码
print(result)
f_url = "https://www.baidu.com/s?" + result
print(f_url)
​
# 第二种方法
'''
url单个字符串编码用quote()函数
'''
r = "海贼王"
result = urllib.parse.quote(r)
print(result)
f_url = "https://www.baidu.com/s?wd=" + result
print(f_url)

urllib保存图片实例分析

"""urllib方法
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,我们可以利用这个回调函数来显示当前的下载进度。
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,headers),filename表示保存到本地的路径,header表示服务器的响应头。
"""
from urllib import request
from urllib.request import urlretrieve
url = "https://img1.baidu.com/it/u=1597761366,2823600315&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"
request.urlretrieve(url=url, filename="girl2.png")
​
# reuqest方法
import requests
url = "https://img1.baidu.com/it/u=1597761366,2823600315&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"
response = requests.get(url)
with open("girl.jpg", mode="wb")as f:
    f.write(response.content)

Requests模块

Requests简介

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 哦!

  • Beautiful is better than ugly.(美丽优于丑陋)
  • Explicit is better than implicit.(清楚优于含糊)
  • Simple is better than complex.(简单优于复杂)
  • Complex is better than complicated.(复杂优于繁琐)
  • Readability counts.(重要的是可读性)

Requests模块的安装

Requests是Python语言的第三方的库,专门用于发送HTTP请求 安装方式

  • pip install requests
  • 在开发工具中安装
pip install requests
# 若出现下载超时,换源即可# 示例
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
​
# 阿里云 http://mirrors.aliyun.com/pypi/simple/
# 豆瓣http://pypi.douban.com/simple/
# 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
# 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
# 华中科技大学http://pypi.hustunique.com/

Requests的使用

Requests常用方法

  • requests.get("网址")
  • request.post("网址")
  • put、delete等等method不常用

Requests常用参数

url 请求的: url 地址 接口文档标注的接口请求地址 params:请求数据中的链接,常见的一个 get 请求,请求参数都是在 url 地址中 data :请求数据,参数 表单的数据格式 json: 接口常见的数据请求格式 headers:请求头信息,http 请求中,比如说编码方式等内容添加 cookie:保存的用户登录信息,比如做一些充值功能,但是需要用户已经登录,需要 cookie信息的请求信息传输

Requests响应内容

r.encoding 获取当前的编码 r.encoding = 'utf-8' 设置编码 r.text 以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。 r.cookies 返回cookie r.headers 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None r.status_code 响应状态码 r.json() Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常 r.content 以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。

Requests中get请求之参数应用

第一种: 把参数添加到url链接中

注意点: 接口与参数之间用?链接,参数用key=value的形式表示,多个参数用&符号链接

搜狗搜索
import requests
url = 'https://www.sogou.com/web?query=%E6%B5%B7%E8%B4%BC%E7%8E%8B&_asf=www.sogou.com&_ast=&w=01015002&p=40040108&ie=utf8&from=index-nologin&s_from=index&oq=&ri=0&sourceid=sugg&suguuid=&sut=0&sst0=1678439364372&lkt=0%2C0%2C0&sugsuv=1666847250696567&sugtime=1678439364372'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
html = requests.get(url, headers=headers).text
print(html)

第二种:把参数添加到params中

注意点: params的数据类型为字典数据,同样必须满足键值对

import requests
url = 'https://www.sogou.com/web'
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
parmas = {
    "query": "海贼王",
    "_asf": "www.sogou.com",
    "_ast": "w: 01015002",
    "p": "40040108",
    "ie": "utf8",
    "from": "index-nologin",
    "s_from": "index",
    "oq": "ri: 0",
    "sourceid": "sugg",
    "suguuid": "sut: 0",
    "sst0": "1678439364372",
    "lkt": "0,0,0",
    "sugsuv": "1666847250696567",
    "sugtime": "1678439364372",
}
html = requests.get(url, headers=headers, params=parmas).text
print(html)

扩展:快速将headers中的参数匹配为字典数据
使用正则替换
1 ctrl+r 选中
​
2 (.*):\s(.*)$
  "$1":"$2",
​
3 regax 勾选 
​
4 replace all
​

Requests中post请求

requests请求方法除了get请求方法外,还有其他方法,比如常用的post方法 什么场景下需要用到post方法呢?

  1. 网页需要登录的情况下;
  2. 需要给网页传输内容的情况下。

其实用法大都数和get请求一样,只是需要加上data参数 语法格式

response = requests.post("http://www.baidu.com/", data = data,headers=headers)

360翻译实例

import requests

headers = {
    "pro": "fanyi",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"
}
word = input('请输入你要翻译的内容:')

url = f"https://fanyi.so.com/index/search?eng=1&validate=&ignore_trans=0&query={word}"
data = {
    "eng": "1",
    "validate": "",
    "ignore_trans": "0",
    "query": f"{word}"
}
response = requests.post(url, headers=headers, data=data)
response.encoding = 'utf-8'
data = response.json()
print(data, type(data))
print(data['data']['fanyi'])

Cookie与Session实战

在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且在很长时间内都不会失效,这又是什么情况?其实这里面涉及 Session 和Cookie 的相关知识,本节就来揭开它们的神秘面纱。

概念

Cookie

通过在客户端记录的信息确定用户身份 HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。

Session

Session,中文称之为会话,通过在服务端记录的信息确定用户身份 这里这个session就是一个指的是会话。其本义是指有始有终的一系列动作、消息。例如打电话时,从拿起电话拨号到挂断电话之间的一系列过程就可以称为一个 Session。

爬虫图解Cookie与Session

登录的流程

这样做有什么好处?

最大的好处就是用户只需要输入一次账号密码,之后再访问网页时,只需要再Headers信息利用Cookie包含Session_id,后台就可以根据Session_id来判断用户是否登录。

Set_cookie

打开闪职时候,因为我们前面多次登录过,因此Cookie信息会一直保存在浏览器中,我们要做的就是先清除Cookie 清除完Cookie刷新界面重新登录 image.png 再次登录后 image.png

Cookie与Session实战案例