urllib 的 get 请求和 post 请求(二)

目录

一、爬取网页、图片视频 

二、请求对象的定制

三、get请求的urlencode方法

四、post 请求英文翻译


一、爬取网页、图片视频 

目标:下载数据

知识点:urllib.request.urlretrieve()下载

使用urllib下载网页、图片和视频

下载网页:

# 下载一个网页
url_page= 'http://www.baidu.com'
# 参数: url 下载的路径  filename 文件名
urllib.request.urlretrieve(url_page, 'baidu.html')

下载图片: 

# 下载图片
url_img = 'https://ts3.cn.mm.bing.net/th?id=OIP-C.nkWmM-lReaN8kH-ieXmZrQHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2'
urllib.request.urlretrieve(url_img, 'img.png')

下载视频:

# 下载视频
# 网页--> 检查 --> (小箭头)定位视频,保存视频地址
url_video = 'https://www.youtube.com/watch?v=aT66uumZ0Zo'
urllib.request.urlretrieve(url_video, 'wind.mp4')

完整代码:

import urllib.request# # 下载一个网页
# url_page= 'http://www.baidu.com'
# # 参数: url 下载的路径  filename 文件名
# urllib.request.urlretrieve(url_page, 'baidu.html')# 下载图片
url_img = 'https://ts3.cn.mm.bing.net/th?id=OIP-C.nkWmM-lReaN8kH-ieXmZrQHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2'
urllib.request.urlretrieve(url_img, 'img.png')# 下载视频
# 网页--> 检查 --> (小箭头)定位视频,保存视频地址
url_video = 'https://www.youtube.com/watch?v=aT66uumZ0Zo'
urllib.request.urlretrieve(url_video, 'wind.mp4')

二、请求对象的定制

目标:爬取整个网页

知识点:学习一种反爬方法,并定制请求对象

1.设置url

设置 url ,现在很多网站都是使用 https协议,安全性更高,所以爬取这类网站,要添加反爬方法。

# 这里换成了 https
url = 'https://www.baidu.com'

 URL组成:

# url 的组成
# url = 'https://ts3.cn.mm.bing.net/th?id=OIP-C.nkWmM-lReaN8kH-ieXmZrQHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2'# http/https(添加了SSL协议)  ts3.cn.mm.bing.net   80/443    th    id=...    #
#        协议                      主机           端口号    路径   参数     锚点# 端口号
# http  80
# https 443
# mysql 3306
# oracle 1521
# redis 6379
# mongodb 27017

2.设置UA 

user_agent:中文名Wie用户代理,简称UA,他是一个特殊字符串头,是的服务器能够市北客户使用的操作系统及版本,CPU类型,浏览器及版本,浏览器渲染引擎,浏览器语言,浏览器插件等。

如何获取UA呢?

随便打开一个网页,右键选择检查 --> 网络(network) --> 全部(all)--> 左边随便点一个 --> 标头(header)--> 请求标头(request header)--> User-Agent 复制“User-Agent”及其后面的内容。

 将上面获取的信息写成一个字典

# 网页检查 --> 网络 --> request --> User-Agent
# UA是反爬的一种手段
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}

3.定制请求对象

注意:request.urlopen()只接受字符串格式和request格式

所以我们要将 url和header的组合封装成一个 request格式的元素

使用urllib.request.Request() 定制请求对象,其中方法中传入的第一个参数为url,第二个为data,第三个为header,所以在传入header时使用关键字传参。

# 不能直接将 headers 放入 urlopen 中,它不能存储字典,只接受字符串和request格式
# 所以我们要进行请求对象的定制
# 注意,由于参数顺序的问题,需要关键字传参
request = urllib.request.Request(url, headers=headers)

3.模拟浏览器向服务器发送请求

response = urllib.request.urlopen(request)

4.打印结果

content = response.read().decode('utf-8')
print(content)

此外,如果不加UA的话,获取的信息就会非常少

完整代码:

import urllib.request# 这里换成了 https
url = 'https://www.baidu.com'
# 网页检查 --> 网络 --> request --> User-Agent
# UA是反爬的一种手段
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}# url 的组成
# url = 'https://ts3.cn.mm.bing.net/th?id=OIP-C.nkWmM-lReaN8kH-ieXmZrQHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.3&pid=3.1&rm=2'
# http/https(添加了SSL协议)     ts3.cn.mm.bing.net      80/443         th      id=...    #
#           协议                   主机                 端口号         路径      参数      锚点# 端口号
# http  80
# https 443
# mysql 3306
# oracle 1521
# redis 6379
# mongodb 27017# 不能直接将 headers 放入 urlopen 中,它不能存储字典,只接受字符串和request格式
# 所以我们要进行请求对象的定制
# 注意,由于参数顺序的问题,需要关键字传参
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
# 打印出的结果比较少,原因是遇到了反爬,给的数据不完整,所以要加user-Agent

三、get请求的urlencode方法

 目标:爬取网页,url中存在中文的情况

知识点:urllib.parse.quote()方法

1.设置url

导入包

import urllib.request
import urllib.parse
url = 'https://www.baidu.com/s?wd='
# 将‘周杰伦’三个字变成Unicode格式编码
# 我们需要依赖urllib.parse。
# 缺点:quote只能操作一个词,不能批量处理
name = urllib.parse.quote('周杰伦')    # %E5%91%A8%E6%9D%B0%E4%BC%A6
url = url + name# 或者直接这么操作
# url = 'https://www.baidu.com/s?wd=' + urllib.parse.quote('周杰伦')

2.设置UA

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}

3.定制请求对象

request = urllib.request.Request(url, headers=headers)

4.模拟浏览器向服务器发送请求

response = urllib.request.urlopen(request)

5.打印结果

content = response.read().decode('utf-8')
print(content)

完整代码:

import urllib.request
import urllib.parse# url = 'https://www.baidu.com/s?wd =%E5%91%A8%E6%9D%B0%E4%BC%A6'
# url = 'https://www.baidu.com/s?wd = 周杰伦# 需求:获取这个地址下的网页源码(无法解析‘周杰伦’这三个字,换成上面Unicode编码格式就可以成功print )
# url = 'https://www.baidu.com/s?wd = 周杰伦'url = 'https://www.baidu.com/s?wd='
# 将‘周杰伦’三个字变成Unicode格式编码
# 我们需要依赖urllib.parse。
# 缺点:quote只能操作一个词,不能批量处理
name = urllib.parse.quote('周杰伦')
url = url + name# 或者直接这么操作
# url = 'https://www.baidu.com/s?wd=' + urllib.parse.quote('周杰伦')headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}request = urllib.request.Request(url, headers=headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)

四、post 请求英文翻译

 目标:获取百度翻译的翻译参数信息
知识点:post请求和get请求定制请求参数的方式不同

urllib.parse.urlencode(data).encode('utf-8')

request = urllib.request.Request(url, data, headers)

1.设置url

# 百度翻译 spider --> 蜘蛛
# 网页检查 --> network --> all -->选择sug元素 看标头和负载
# url是sug元素的标头的request url (如果没有sug可能是因为输入’spider‘时是用中文输入的,改成英文输入就显示了)

# post 请求
url = 'https://fanyi.baidu.com/sug'

2.设置UA

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}

3.设置参数

data中“kw”就是 网页检查 --> network --> all -->选择sug元素 的负载(payload)

data = {'kw':'spider'
}# post请求的参数 必须要进行编码,不编码的data是字符串类型,但是发送到服务器时需要使字节形式
data = urllib.parse.urlencode(data).encode('utf-8')

4.定制请求参数

# post的请求参数是不会拼接在url的后面的,而是需要放在请求对象定制的参数中
# post 请求的参数 必须要进行编码
request = urllib.request.Request(url, data, headers)

5.模拟浏览器向服务器发送请求

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)

6. 获取数据

直接输出的数据格式是字符串,无法显示中文 

# 获取相应的数据
content = response.read().decode('utf-8')print(content)  #{"errno":0,"data":[{"k":"spider","v":"n. \u8718\u86db; \u661f\u5f62\u8f6e\uff0c\u5341\u5b...
print(type(content))    # <class 'str'>

7.将结果转为json格式

# 字符串 --> json对象
import json
obj = json.loads(content)
print(obj)  # {'errno': 0, 'data': [{'k': 'spider', 'v': 'n. 蜘蛛; 星形轮,十字叉; 带柄三脚平底锅; 三脚架'}, {'k': 'Spider', 'v': '[电影]蜘蛛'}, {'k': 'SPIDER', 'v': 'abbr. SEMATECH process induced damage effect revea'}, {'k': 'spiders', 'v': 'n. 蜘蛛( spider的名词复数 )'}, {'k': 'spidery', 'v': 'adj. 像蜘蛛腿一般细长的; 象蜘蛛网的,十分精致的'}], 'logid': 2230303859}
# 总结
# post请求方式的参数,必须编码 data = urllib.parse.urlencode(data).encode('utf-8')
# 编码之后必须调用 encode 方法
# 参数放在请求对象定制的方法中,不能拼接

完整代码:

import urllib.request
import urllib.parse# 百度翻译 spider --> 蜘蛛
# 网页检查 --> network --> all -->选择sug元素 看标头和负载
# url是sug元素的标头的request url (如果没有sug可能是因为输入’spider‘时是用中文输入的,改成英文输入就显示了)# post 请求
url = 'https://fanyi.baidu.com/sug'headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}data = {'kw':'spider'
}# post请求的参数 必须要进行编码,不编码的data是字符串类型,但是发送到服务器时需要使字节形式
data = urllib.parse.urlencode(data).encode('utf-8')# post的请求参数是不会拼接在url的后面的,而是需要放在请求对象定制的参数中
# post 请求的参数 必须要进行编码
request = urllib.request.Request(url, data, headers)# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)content = response.read().decode('utf-8')# 获取相应的数据
print(content)  #{"errno":0,"data":[{"k":"spider","v":"n. \u8718\u86db; \u661f\u5f62\u8f6e\uff0c\u5341\u5b...
print(type(content))    # <class 'str'># 字符串 --> json对象
import json
obj = json.loads(content)
print(obj)  # {'errno': 0, 'data': [{'k': 'spider', 'v': 'n. 蜘蛛; 星形轮,十字叉; 带柄三脚平底锅; 三脚架'}, {'k': 'Spider', 'v': '[电影]蜘蛛'}, {'k': 'SPIDER', 'v': 'abbr. SEMATECH process induced damage effect revea'}, {'k': 'spiders', 'v': 'n. 蜘蛛( spider的名词复数 )'}, {'k': 'spidery', 'v': 'adj. 像蜘蛛腿一般细长的; 象蜘蛛网的,十分精致的'}], 'logid': 2230303859}# 总结
# post请求方式的参数,必须编码 data = urllib.parse.urlencode(data).encode('utf-8')
# 编码之后必须调用 encode 方法
# 参数放在请求对象定制的方法中,不能拼接

参考

尚硅谷Python爬虫教程小白零基础速通(含python基础+爬虫案例)

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

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

相关文章

Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配

Title: Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配 文章目录 I 前言II. 查看 ROS 消息III. Livox ROS 驱动的消息类型IV. 适配修改应用程序V. 总结 I 前言 有时候, 拿到最新的 Livox 激光传感器, 比如 HAP, 原厂也提供了 ROS 驱动支持 livox_ros_drivers2 (htt…

Docker的数据卷

数据卷 1.数据卷概述 数据卷&#xff1a;容器与宿主机之间数据共享。 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。 可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻可见&#xff0c;并且更新数据不会影响镜像&#xff0c;从而实现数据在宿…

Spring基于注解存储对象

小王学习录 前言基于注解存储对象Controller (控制器存储)Service (服务存储)Repository (仓库存储)Component (组件存储)Configuration (配置存储)Bean(方法注解) 前言 上一篇文章中已经介绍了在Spring中存储Bean和取Bean的方法. 而在 Spring 中想要更简单的存储和读取对象的…

micro_ros_setup包镜像及部分注释(我觉得此包支持很有限)

GitHub - micro-ROS/micro_ros_setup at humble README.md This ROS 2 package(这是一个包) is the entry point for building micro-ROS apps for different embedded platforms. Supported platforms Standalone build system toolsDependenciesQuick startBuilding Creati…

C++多态(详解)

一、多态的概念 1.1、多态的概念 多态&#xff1a;多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生买票时&am…

100. 相同的树(Java)

目录 解法&#xff1a; 官方解法&#xff1a; 方法一&#xff1a;深度优先搜索 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 方法二&#xff1a;广度优先搜索 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给你两棵二叉树的根节点 p 和…

【日常总结】mybatis-plus WHERE BINARY 中文查不出来

目录 一、场景 二、问题 三、原因 四、解决方案 五、拓展&#xff08;全表全字段修改字符集一键更改&#xff09; 准备工作&#xff1a;做好整个库备份 1. 全表一键修改 Stage 1&#xff1a;运行如下查询 Stage 2&#xff1a;复制sql语句 Stage 3&#xff1a;执行即可…

了解Linux网络配置

本章主要介绍网络配置的方法。 网络基础知识 查看网络信息 图形化界面修改 通过配置文件修改 命令行管理 11.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP、 子网掩码、网关和 DNS。 11.1.1 IP 地址 在计算机…

一文3000字从0到1用Python进行gRPC接口测试!

gRPC 是一个高性能、通用的开源RPC框架&#xff0c;其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计&#xff0c;基于 ProtoBuf(Protocol Buffers) 序列化协议开发&#xff0c;且支持众多开发语言。 自gRPC推出以来&#xff0c;已经广泛应用于各种服务之中。在测…

Python 作业答疑

1. 哥德巴赫猜想 问题描述&#xff1a; 2000以内的不小于4的正偶数都能够分解为两个素数之和&#xff08;即验证歌德巴赫猜想对2000以内的正偶数成立&#xff09;。 问题分析&#xff1a; 根据问题描述&#xff0c;为了验证歌德巴赫猜想对2000以内的正偶数都是成立的&#…

Android 11 适配——整理总结篇

背景 > 经过检测&#xff0c;我们识别到您的应用&#xff0c;目前未适配安卓11&#xff08;API30&#xff09;&#xff0c;请您关注适配截止时间&#xff0c;尽快开展适配工作&#xff0c;避免影响应用正常发布和经营。 > targetSdkVersion30 升级适配工作参考文档&am…

SRC挖掘漏洞XSS

Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的…