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基础+爬虫案例)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

六、ZGC深度剖析

一、引言 对于Java 程序员来说&#xff0c;JVM 帮助我们做了很多事情。 JVM是虚拟机&#xff0c;能够识别字节码&#xff0c;就是class文件或者你打包的jar文件&#xff0c;运行在操作系统上。 JVM帮我们实现了跨平台&#xff0c;你只需要编译一次&#xff0c;就可以在不同的…

traj_dist 笔记 源代码解析(python部分)

1distance.py 1.1 METRIC_DIC 不同实现方法对应的函数路径 1.2 sspd 功能&#xff1a; 计算轨迹 traj_1 和 traj_2 之间的对称化段路径距离。 参数&#xff1a; traj_1&#xff1a;一个二维 numpy 数组&#xff0c;代表第一个轨迹。traj_2&#xff1a;一个二维 numpy 数组…

FreeRTOS的三处栈空间设置分析

1、汇编启动代码中设置栈 这个栈空间只有300字节&#xff0c;是用于汇编启动代码早期&#xff0c;以及调用C语言的main函数&#xff08;创建任务等&#xff09;在创建好任务&#xff0c;启动调取器后&#xff0c;这个栈空间就被抛弃掉&#xff0c;后续不会使用到等调度器开启后…

星际飞船大战

欢迎来到程序小院 星际飞船大战 玩法&#xff1a;滑动鼠标控制方向&#xff0c;点击鼠标左键射击&#xff0c;生命值100分&#xff0c;被敌船击中减去20&#xff0c; 5次生命复活机会&#xff0c;统计分数&#xff0c;快去星际飞船大战吧^^。开始游戏https://www.ormcc.com/pl…

Dijkstra求最短路 II(堆优化Dijkstra算法)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为非负值。 请你求出 11 号点到 n 号点的最短距离&#xff0c;如果无法从 11 号点走到 n 号点&#xff0c;则输出 −1−1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含…

鱼骨探矿的题解

原题描述&#xff1a; 题目描述&#xff1a; 众所周知&#xff0c;《我的世界》中一种非常流行的探矿方式就是鱼骨探矿。 我的世界的地图可以看作一个的正方形世界。 经过初步探测&#xff0c;在第 i 行&#xff0c;[li, ri] 区间内可能存在宝藏。为了探索效率&#xff0c;…

C# | 对比不同种类的锁

文章目录 C# 对比不同种类的锁异同点对比表使用方法lock语句Monitor类Mutex类Semaphore类ReaderWriterLock类 结语 C# 对比不同种类的锁 Hi&#xff0c;在C#编程中&#xff0c;想要保护共享资源&#xff0c;通常会用到各种类型的锁。今天我们就来一起看看C#中不同种类的锁&…

geolife 笔记:将所有轨迹放入一个DataFrame

单条轨迹的处理&#xff1a;geolife笔记&#xff1a;整理处理单条轨迹-CSDN博客 1 加载数据 import pandas as pd import numpy as np import datetime as dt import osdata_dir Geolife Trajectories 1.3/Data/ 1.1 列出所有文件夹 dirlist os.listdir(data_dir) dirlist…

基于Qt开发的闹钟

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);speecher new QTextToSpeech(this); }Widget::~Widget() {delete ui; }//定时器超时时&#xff0c;自动执行的…

Ubuntu22.04中用户的全名

概要&#xff1a; 用户的全名有别于用户名username username可以理解为账户名&#xff0c;或者说用户ID&#xff0c;用于确定身份&#xff0c;显然是必需的 用户全名则不是必需的&#xff0c;用户全名也叫做注释&#xff0c;是一种辅助信息&#xff0c;如果没有填写用户全名…

docker 资源控制

Docker的资源控制 对容器使用宿主机的资源进行限制&#xff0c;如cpu&#xff0c;内存&#xff0c;磁盘I/O Docker使用linux自带的功能cgroup(control grouos)是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程组使用的物理资源 Docker借助这个机制&…

MySQL执行流程_执行一条select语句,期间发生了什么

文章目录 执行一条select语句&#xff0c;期间发生了什么MySQL执行流程第一步&#xff1a;连接器第二步&#xff1a;查询缓存第三步&#xff1a;解析SQL第四步&#xff1a;执行SQL 执行一条select语句&#xff0c;期间发生了什么 MySQL执行流程 server层负责建立连接、分析和执…

Banana Pi BPI-R4 SBC/路由器推出,带双 10G SFP+ 端口+Wifi7支持

Banana Pi BPI-R4 wifi7路由器开发板 香蕉派 Banana Pi BPI-R4 根据著名Banana Pi品牌背后的公司Sinovoip提供的初步信息&#xff0c;他们即将推出的Banana Pi BPI-R4路由器板目前已经正式发售。与之前的 Banana Pi R3 板相比&#xff0c;这在规格上将有显着提升。这就是我们…

99基于matlab的小波分解和小波能量熵函数

基于matlab的小波分解和小波能量熵函数&#xff0c;通过GUI界面导入西储大学轴承故障数据&#xff0c;以可视化的图对结果进行展现。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 99小波分解和小波能量熵函数 (xiaohongshu.com)https://www.xiaohongshu.co…

【离散数学】——期末刷题题库( 二元关系)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

eclipse的日志文件放在什么位置

eclipse的日志文件放在<workspace的目录>/.metadata目录下面&#xff0c;例如&#xff1a;

Java基础语法之访问修饰限定符

private 表示私有的&#xff0c;只能在同一个包中的同一个类使用 像这样就是在同一个包中的不同类用了private修饰的变量&#xff0c;这是非法的&#xff0c;那到底该如何给a赋值呢&#xff1f;可以在定义时就赋值&#xff0c;但这样的代码就没有可操作性&#xff0c;所以我们…

Nginx的location匹配和rewrite重写

一、location匹配 常用的正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll…

java--HashMap、LinkedHashMap、TreeMap底层原理

1.HashMap集合的底层原理 ①HashMap跟HashSet的底层原理是一模一样的&#xff0c;都是基于哈希表实现的。 ②实际上&#xff1a;原来学的Set系列集合的底层原理就是基于Map实现的&#xff0c;只是Set集合中的元素只要键数据&#xff0c;不要值数据而已。 2.哈希表 ①JDK8之前…

原创度检测,在线文章原创度检测

原创度检测&#xff0c;作为数字时代中内容创作者和学术界广泛关注的话题&#xff0c;正逐渐成为保障知识产权、促进创新发展的不可或缺的工具。今天&#xff0c;我们将深入介绍原创度检测的定义、意义、技术原理、应用领域以及未来趋势。 一、什么是原创度检测&#xff1f; 原…