网络请求模块
urllib模块讲解
urllib.request
- urllib 库 是 Python 内置的 HTTP 请求库。
urllib.request是什么
-
常用的方法
- urllib.request.urlopen(“网址”/“请求对象”) 作用 :向网站发起一个请求并获取响应。 urlopen()不支持重构User-Agent
- urllib.request.Request(“网址”,headers=“字典”) ,该方法返回一个请求对象
urllib.request.urlopen(“网址”/“请求对象”)实例一(不重构请求头)
-
不重构请求头可以访问部分未进行反爬的网站,如下
import urllib.request # urllib 是一个内置库 不用我们通过pip工具进行安装 进行导入就行 # 第一步 目标url url = "http://www.baidu.com" # 第二步 发起请求 response = urllib.request.urlopen(url) # ctrl+鼠标左键或者ctrl+B,可进入该函数,查看该函数的说明 """Open the URL url, which can be either a string or a Request object 参数我们不仅可以传入一个网址 也可以传入一个对象 which 是什么从句 定位从句 either ... or ... 要么 要么 """ print(response) # HTTPResponse object 响应对象 # 第三步 获取响应 # html = response.read() # 获取字节流 # print(html) html = response.read().decode('utf-8') # 获取字符串 print(html) print(response.getcode()) # 返回HTTP的响应码 print(response.geturl()) # 返回实际数据的URL
urllib.request.urlopen(“网址”/“请求对象”)实例二(重构请求头)
-
如豆瓣网站具有反爬功能,必须重构请求头才能进行爬取,那么则可以利用urllib.request.Request(“网址”,headers=“字典”)方法,通过它返回的请求对象,作为urllib.request.urlopen(“网址”/“请求对象”)的参数。一共也是三步。
import urllib.request # urllib.request.Request() # 创建请求对象并构建User-Agent # 目标url url = "https://www.douban.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" } # 第一步 创建请求对象并构建User-Agent req = urllib.request.Request(url, headers=headers) print(req) # <urllib.request.Request object at 0x000001FF91613FD0> 请求对象 # 第二步 获取响应对象 urlopen """我们依然是用urlopen()方法来发送这个请求,只不过这次urlopen()方法的参数不再是一个URL, 而是一个Request请求对象,通过构造这个请求头 一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。""" response = urllib.request.urlopen(req) # 第三步 读取响应对象的内容 read().decode("utf-8") html = response.read().decode("utf-8") print(html) print(response.getcode())#返回HTTP状态码 print(response.geturl())#返回实际数据的url
-
以上三个步骤代码可以浓缩成一行代码
html = urllib.request.urlopen("http://www.baidu.com").read().decode('utf-8') print(html)
urllib.parse模块详解
以百度搜索海贼王为例
右键检查 -> 选择network -> 过滤Doc静态资源文件 -> 选择preview(查看预览是否与当前页面一致,没有图片的原因是图片不存在doc中而是在image包中) -> response(响应体即网络源代码) -> headers(查看请求头,可以把"wd=海贼王"后半部分参数删了)-> 重复发送请求(查看size,如果size在删除参数后骤然变小,则可以推测某部分是参数负责了加密) -> 接着看headers -> url很长,其实就是由"
https://www.baidu.com/s?
"和payload中的参数构成的
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)#分别输入url1、url2、url3,发现url2报错 print(req) # UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)
方法一:使用urlencode(字典) 推荐
-
# 第一种方法 ''' 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)
方法二:使用quote(字符串)
-
# 第二种方法 ''' url单个字符串编码用quote()函数 ''' r = "海贼王" #字符串 result = urllib.parse.quote(r) print(result) f_url = "https://www.baidu.com/s?wd=" + result print(f_url)
urllib保存图片
百度搜索某类型图片,点开某图片 -> 此时浏览器网址栏的url是图片的下载地址吗?答:不是,下载是由另外的url构成的。 -> 鼠标右键检查 -> element -> 点击图片,会自动展示出图片的下载地址。或者右键图片,选择复制图片地址。
使用urlretrieve方法
-
""" urlretrieve方法 参数说明: url:外部或者本地url filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据); reporthook:是一个回调函数,我们可以利用这个回调函数来显示当前的下载进度。 data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,headers),filename表示保存到本地的路径,header表示服务器的响应头。 """ from urllib.request import urlretrieve url = "https://nimg.ws.126.net/?url=https://dingyue.ws.126.net/2021/0705/cd49fbabj00qvqyrd002bc000hs012hc.jpg&thumbnail=650x2147483647&quality=80&type=jpg" urlretrieve(url=url, filename="girl1.png")
使用requests 方法下载图片
-
import requests url = "https://nimg.ws.126.net/?url=https://dingyue.ws.126.net/2021/0705/cd49fbabj00qvqyrd002bc000hs012hc.jpg&thumbnail=650x2147483647&quality=80&type=jpg" response = requests.get(url) print(response,type(response)) #response是一个请求对象 with open("girl2.jpg", mode="wb")as f: #使用字节流写入 f.write(response.content) #response.content获得的是下载内容的二进制内容
使用requests 方法下载视频
抖音网页 -> 点击检查 -> network -> 清空 -> 选择media -> 刷新 -> 选择下方name列表中的一个 -> header中的url -> 通过直接访问该url判断其是否为视频地址
-
# 下载视频 url = 'https://v26-web.douyinvod.com/bf3e12c1875411fd7d0e1351b8777d34/65255b4a/video/tos/cn/tos-cn-ve-15c001-alinc2/o4h8oABAgL9D4JfDXbCAeQnCluicEndpHpDgAA/?a=6383&ch=5&cr=3&dr=0&lr=all&cd=0%7C0%7C0%7C3&cv=1&br=534&bt=534&cs=2&ds=3&ft=bvTKJbQQqU-mfJ4ZPo0OW_EklpPiXOUY7FVJEZ8W2cbPD-I&mime_type=video_mp4&qs=15&rc=NmhnNzw7ZjplOGQ1MzQ0NEBpMzs1MzM6Zmo6bjMzNGkzM0AyXjAwMTAyXmIxYDExNGJgYSNhLTVkcjRvMWNgLS1kLTBzcw%3D%3D&btag=e00008000&dy_q=1696943408&l=202310102110073115065F872CC224E1CE' response = requests.get(url) with open("girl.mp4", mode="wb")as f: f.write(response.content)
Requests模块讲解
Requests简介
- Requests是用Python语言编写,基于 urllib的开源协议的第三方 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。
requests模块的安装
-
换源安装《Python第一个爬虫程序中讲过》
-
这里讲一下换源安装
注意:建议不要进行永久换源安装,因为有些不全
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/