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

news2024/11/25 12:44:00

目录

一、爬取网页、图片视频 

二、请求对象的定制

三、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.coloradmin.cn/o/1288716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态规划】LeetCode2111:使数组 K 递增的最少操作次数

作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本文涉及的基础知识点 二分查找算法合集 分组 动态规划 题目 给你一个下标从 0 开始包含 n 个正整数的数组 arr &#xff0c;和一个正整数 k 。 如果对于每个满足 k < i < n-1 的下标 i &#xff0c;都有…

项目进度已经落后了,项目经理该怎么办?

进度管理是项目管理的核心工作之一&#xff0c;通过可续的进度计划与控制管理&#xff0c;最终实现项目按照目标交付。 进度管理的两大核心工作&#xff1a;计划制定、过程管控。 项目管理过程中难免会遇到工作进度和计划不一致的情况&#xff0c;有效管理项目进度&#xff…

数字工厂时代,如何实现3D数据访问与发布、WEB大模型可视化?

Tech Soft 3D的HOOPS 3D CAD SDK为现代工厂工作流程奠定了基础&#xff0c;通过最快、最准确的CAD数据访问和动态3D可视化支持数字孪生、机器人仿真、设计、流程和规划、IIoT和操作辅助应用程序。 本文将和您详细探讨。如何利用HOOPS技术来增强您的应用程序。 HOOPS_HOOPS试…

INFINI Console 与华为鲲鹏完成产品兼容互认证

何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务&#xff08;含公有云、私有云、混合云、桌面云&#xff09;推出的一项合作伙伴计划&#xff0c;旨在为构建持续发展、合作共赢的鲲鹏生态圈&#xff0c;通过整合华为的技术、品牌资源&#xff0c;与合作伙伴共享商机和利…

【Verilog】 FPGA程序设计---Verilog基础知识

目录 Verilog 和 VHDL 区别 Verilog 和 C 的区别 Verilog 基础知识 1 Verilog 的逻辑值 2 Verilog 的标识符 3 Verilog 的数字进制格式 4 Verilog 的数据类型 1) 寄存器类型 2) 线网类型 3) 参数类型 5 Verilog 的运算符 1) 算术运算符 2) 关系运算…

GOLAND搭建GIN框架以及基础框架搭建

创建GO环境文件夹 终端输入安装GIN go get -u github.com/gin-gonic/gin如果遇到超时错误 package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html": https fetch: Get "https://golang.org/x/net/html?go-get1": dial tcp …

设计模式之GoF23介绍

深入探讨设计模式&#xff1a;构建可维护、可扩展的软件架构 一、设计模式的背景1.1 什么是设计模式1.2 设计模式的历史 二、设计模式的分类2.1 创建型模式2.2 结构型模式2.3 行为型模式 三、七大设计原则四、设计模式关系结论 :rocket: :rocket: :rocket: 在软件开发领域&…

关于大模型在文本分类上的尝试

文章目录 前言所做的尝试总结前言 总共25个类别,在BERT上的效果是48%,数据存在不平衡的情况,训练数据分布如下: 训练数据不多,4000左右 所做的尝试 1、基于 Qwen-14b-base 做Lora SFT,Loss忘记记录 准确率在68%左右 Lora配置 class LoraArguments:lora_r: int = 64…

马尔科夫决策过程(Markov Decision Process)揭秘

RL基本框架、MDP概念 MDP是强化学习的基础。MDP能建模一系列真实世界的问题&#xff0c;它在形式上描述了强化学习的框架。RL的交互过程就是通过MDP表示的。RL中Agent对Environment做出一个动作&#xff08;Action&#xff09;&#xff0c;Environment给Agent一个反馈&#xff…

leetcode:LCR 122. 路径加密(python3解法)

难度&#xff1a;简单 假定一段路径记作字符串 path&#xff0c;其中以 "." 作为分隔符。现需将路径加密&#xff0c;加密方法为将 path 中的分隔符替换为空格 " "&#xff0c;请返回加密后的字符串。 示例 1&#xff1a; 输入&#xff1a;path "a.a…

「Verilog学习笔记」无占空比要求的奇数分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule odd_div ( input wire rst ,input wire clk_in,output wire clk_out5 ); //*************code***********//reg [1:0] data ;reg […

在耳机心率血氧健康检测中应用的穿戴心率血氧接收芯片

时代快速发展的今天&#xff0c;随着生活节奏的加快&#xff0c;工作压力的加大&#xff0c;越来越多的消费者开始关注到自身身体健康&#xff0c;加班熬夜生活不规律&#xff0c;很容易让我们的身体处于亚健康的状态&#xff0c;而心率和体温的变化&#xff0c;就能反应我们身…

Python源码30:海龟画图turtle画紫色的小熊

turtle模块是一个Python的标准库之一&#xff0c;它提供了一个基于Turtle graphics的绘图库。Turtle graphics是一种流行的绘图方式&#xff0c;它通过控制一个小海龟在屏幕上移动来绘制图形。 turtle模块可以让您轻松地创建和控制海龟图形&#xff0c;从而帮助您学习Python编…

预览控制;预见控制;预测控制;预观控制(preview control)

预演控制&#xff08;preview control&#xff09;作为一种新兴的控制方法&#xff0c;首次在轮式车辆中被提出。 参考文献&#xff1a; https://www.sciencedirect.com/science/article/pii/S0016003219300390https://www.sciencedirect.com/science/article/pii/S0016003219…

企企通供应链专家:拥抱智能化趋势,企业如何打造智慧供应链形成竞争优势?

智能时代&#xff0c;数字生产力正在逐步成为推动经济发展和社会进步的核心引擎。随着互联网技术的不断创新与发展&#xff0c;以5G、云计算、人工智能等数字技术为代表的先进生产工具&#xff0c;其价值和潜力日益凸显&#xff0c;智能化也逐渐成为企业未来竞争高地之一。 近日…

数字化转型如何落地?_光点科技

数字化转型是现代企业发展的关键环节&#xff0c;它不仅仅是技术的升级&#xff0c;更是企业文化、运营模式和市场战略的全面革新。一个成功的数字化转型能够为企业带来更高效率、更好的客户体验和更强的市场竞争力。那么&#xff0c;数字化转型如何落地呢&#xff1f; 确定转型…

医院预约挂号平台的设计与实现

摘 要 网络的空前发展给人们的工作和生活带来了极大的便利&#xff0c;信息技术已成为节约运营成本、提高工作效率的首选。相比之下&#xff0c;国内相当多的中小医院在医院预约工作中的手工工作比较保守&#xff0c;数据查询和存储成本都很高&#xff0c;但效率很低。为了使医…

组合总和II(回溯、去重)

40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a…

git submodule 用法

子仓库启蒙 在根目录执行&#xff1a; git submodule add gitgitee.com:liaosp/dcat-admin-basic-interface.git想要子模块指定的分支&#xff1a; git submodule add -b dev <仓库地址> <子模块路径>这样相当于在根目录上添加了 .gitmodules 信息&#xff0c;相…

SystemWeaver—电子电气系统协同研发平台

背景概述 当前电子电气系统在汽车领域应用广泛&#xff0c;其设计整合了多门工程学科&#xff0c;也因系统的复杂性、关联性日益提升&#xff0c;需要其提供面向软件、硬件、网络、电气等多领域交织而导致的复杂系统解决方案。并且随着功能安全、AUTOSAR、SOA、以太网通讯等新要…