Python爬虫之urllib模块详解

news2024/11/15 17:56:01

Python爬虫入门

此专栏为Python爬虫入门到进阶学习。
话不多说,直接开始吧。

urllib模块

Python中自带的一个基于爬虫的模块,其实这个模块都几乎没什么人用了,我就随便写写了。

- 作用:可以使用代码模拟浏览器发起请求。(request、parse)
- 使用流程:
		- 指定url
		- 针对指定url发起请求
		- 获取服务器响应回来的页面数据
		- 持久化存储

1、urllib编写一个简单的爬虫程序

要求:爬取搜狗首页页面数据
注意,urllib等模块包需要通过pip下载,如果配置好了pip,直接pip install urllib就可以了,由于不是新手教程,就不再提及。

import urllib.request

#1.指定url
url = "https://www.sogou.com/"

#2.发起请求:urlopen可以根据指定url发起请求。且返回一个响应对象
#request是urllib的子模块,urlopen则是request的函数,表示打开一个url。括号里第一个url是urlopen的参数,则需要将url赋值给此url。
response = urllib.request.urlopen(url=url)

#3.获取页面数据,read函数返回的就是响应对象中存储的页面数据。
# 【这里解释下,response为何可以直接调用read函数,简单来说就是:urlopen( )函数返回的是一个HTTPResponse对象。
# 它包含了read( )、readinto( )、getheader(name)、getheaders( )、fileno( )等方法。
page_text = response.read()

#4.持久化存储,wb=二进制存储
with open('./sougou.html','wb') as f:
    f.write(page_text)
    print("写入数据成功。")

ok,这样的话就能爬取到一个简单的页面数据。

2、URL编码处理

如果我们想爬取的url里边带有中文的话,就要对URL进行编码处理。

import urllib.request
import urllib.parse
#指定URL
url = "https://www.baidu.com/baidu?ie=utf-8&wd=孙燕姿"
#发送请求
response = urllib.request.urlopen(url=url)
#获取页面资源
page_text = response.read()
#打印测试
print(page_text)	

上述代码如果直接执行,就会报错。
在这里插入图片描述
如图,有一个UnicodeEncodeError的错误。
其实,在url中,不能存在非ASCII编码的字符数据,所以这里就会报错。
那么这里就要注意我们之前多引用了一个子模块parse,它就是来解决这个问题的

#quote函数的作用是能将URL中非ASCII码编码字符转码
word = urllib.parse.quote("孙燕姿")
print(word)

通过quote转码就能得出来孙燕姿的编码为
%E5%AD%99%E7%87%95%E5%A7%BF
这样用测试工具再一次转码,就能验证出来了。

n
根据上述,修复代码:

import urllib.request
import urllib.parse

#指定URL
url = "https://www.baidu.com/baidu?ie=utf-8&wd="

#quote函数的作用是能将URL中非ASCII码编码字符转码
word = urllib.parse.quote("孙燕姿")

#发送请求,这里需要将转码后的字符拼接起来
response = urllib.request.urlopen(url=url + f"{word}")

#获取页面资源
page_text = response.read()

#持久化存储
with open("yanzi.html","wb") as f:
    f.write(page_text)

3、UA身份伪装

什么是UA呢?
UA指的是‌User-Agent‌,这是浏览器的身份标识,用于表明浏览器类型、操作系统和版本号等信息。User-Agent字符串被网页服务器用来识别访问者的浏览器信息,从而提供相应的页面内容或功能。例如,不同的浏览器会有不同的User-Agent字符串,如Chrome、Firefox等。通过修改User-Agent,用户可以“假装”使用不同的浏览器,实现一些特定的网络操作或访问一些特定设计的网页内容。

从浏览器自带的开发这工具里,通过请求头就能很好的查看UA等信息。
在这里插入图片描述

  • 反爬机制:网站会检查请求UA,如果发现UA是爬虫,则会拒绝提供网站数据。
  • User-Agent:请求载体的身份。
  • 反反爬机制:伪装爬虫程序请求的UA

下面就来试试吧

import urllib.request

#确认爬虫URL
url = "https://www.baidu.com/"

#伪装UA
#1.自制定请求对象。  Request是request的一个函数,用来自制定请求对象。headers参数是头信息。
#赋值成字典形式的信息。ua可以去网站上复制,也可以随便给一个。

headers = {
    "User-Agent" :
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:127.0) Gecko/20100101 Firefox/127.0"
}

#该请求对象的UA进行伪装
request = urllib.request.Request(url=url, headers=headers)

#2.针对自制定的请求对象发起请求
response = urllib.request.urlopen(request)

#持久化存储
with open("baidu.html", "wb") as f:
    f.write(response.read())

ok,这里其实才能算得上一个初步的爬虫。

四、post请求

以上都是一些get请求,下面来试试post请求。
需求:获取百度翻译的翻译结果。

比如这里输入水,网页就会实时的翻译为water
在这里插入图片描述
首先要先找到这个而请求。

同样,打开浏览器开发者模式,选择翻译软件,请求筛选XHR,这个就可以筛选出来AJAX请求(就是异步js和xml)
在这里插入图片描述
然后根据XHR的请求找到这个对于的请求。
在这里插入图片描述
请求头里的表单数据kw是用于提交给服务器的数据。‌
在HTTP请求中,表单数据通常用于提交信息到服务器。kw作为表单数据的一部分,用于指定要提交的具体内容。在构建HTTP请求时,表单数据可以通过请求头中的特定字段进行传输,以便服务器能够正确处理这些数据。
消息头里便能找到post的请求URL
https://fanyi.baidu.com/sug
在这里插入图片描述
代码如下:

import urllib.request
import urllib.parse
#1.指定URL
url = "https://fanyi.baidu.com/sug"

#2.需要对post请求携带的参数处理
#流程: 1、post请求参数封装到字典中
data = {
    "kw":"水"
}
#2.使用parse模块中的urlencode进行编码处理,返回值为字符串类型
data = urllib.parse.urlencode(data)
# print(type(data))

#3.将步骤2的编码结果转换成byte类型
data = data.encode()

#3.发起post请求,data参数表示的就是经过处理之后的post请求携带的参数。
response = urllib.request.urlopen(url=url, data=data)

response = response.read()
print(response)

拿到运行结果之后,可以去校验json

  • {“errno”:0,“data”:[{“k”:“\u6c34”,“v”:“\u540d. water; river; a general term for rivers, lakes,”},{“k”:“\u6c34\u4e0a”,“v”:“water; aquatic ; overwater; water borne”},{“k”:“\u6c34\u4e0b”,“v”:“underwater; undersea; [\u7535\u5f71]Underwater!”},{“k”:“\u6c34\u4e2d”,“v”:“water ; aquatic”},{“k”:“\u6c34\u4e91”,“v”:“water cloud; water clouds”}],“logid”:1036407526}

结果如下:
在这里插入图片描述
如此,基于post请求完成。主要是针对post请求参数进行处理。

五、urllib高级操作

urllib高级操作有两部分,一是代理,而是基于Cookie的cookie操作。代理和cookie在爬虫中使用还是比较多的,但是我们基本不会使用基于urllib的代理和cookie,因为基于该模块的代理和cookie比较繁琐并且效率较低,通常情况下,我们一般使用基于requests模块或者其他模块的代理和cookie操作,所以这里了解就好,不展开演示。

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

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

相关文章

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块?模块是一个封装了特定功能的代码块,可以独立开发、测试和维护。模块通过导出(export)和导入(import)与其他模块通信,保持内部细节的封装。 前端 JavaScript 模块化是指…

【Pytorch】一文快速教你高效使用torch.no_grad()

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 博主简介 博主致力于嵌入式、Python、人工智能、C/C领域和各种前沿技术的优质博客分享,用最优质的内容带来最舒适的…

2024年中国研究生数学建模竞赛A/C/D/E题全析全解

问题一: 针对问题一,可以采用以下低复杂度模型,来计算风机主轴及塔架的疲劳损伤累积程度。 建模思路: 累积疲劳损伤计算: 根据Palmgren-Miner线性累积损伤理论,元件的疲劳损伤可以累积。因此,…

基于SpringBoot+Vue的商城积分系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

手机在网状态查询接口如何用C#进行调用?

一、什么是手机在网状态查询接口? 手机在网状态查询接口是利用实时数据来对手机号码在运营商网络中的状态进行查询的工具,包括正常使用状态、停机状态、不在网状态、预销户状态等。 二、手机在网状态查询适用哪些场景? 例如:商…

【线程池】ThreadPoolExecutor应用

ThreadPoolExecutor应用 每一步的坚持与积累,都是铸就高薪和大牛的必经的修炼 哈哈,不吹牛逼了,今天来分享最近在提升中的学习总结,无论是对在职场还是求职,看完,我相信都会有些许的收获和成长 也难得过了一个悠闲点的周末,哈哈哈,一起奥利给!! 本文总纲: 1.为什么要自定义线程…

联合体的用法和用联合体判断大小端存储

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所 以联合体也叫:共⽤体。 给联合体其中⼀个成员赋值,其他成…

Linux 文件系统(下)

目录 一.文件系统 1.文件在磁盘上的存储方式 a.盘面、磁道和扇区 b.分区和分组 2.有关Block group相关字段详解 a.inode编号 b.inode Table(节点表) c.Data blocks(数据区) d.小结 二.软硬链接 1.软链接 a.软链接的创建…

SystemExit: 系统退出异常的完美解决方法⚙️

🚪SystemExit: 系统退出异常的完美解决方法⚙️ 🚪SystemExit: 系统退出异常的完美解决方法⚙️摘要引言正文1. 什么是SystemExit异常?📜2. 捕获SystemExit:是否应该这样做?⚠️3. 正确处理SystemExit的最…

javase复习day30综合练习

制造假数据 制造数据 练习一 package Demo1;import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; im…

上海数科(北京)律师事务所开业庆典圆满举行

金秋送爽,丹桂飘香。2024年9月22日,数智科技焕新启航主题论坛暨上海数科(北京)律师事务所(以下简称“数科北京”)开业庆典在北京中海广场中楼隆重举行。 庆典现场星光熠熠,汇聚了来自法律界、科…

程序员的AI时代:拥抱变革,塑造未来

你们有没有想过,如果有一天,你的编程工作被一个AI助手取代了,你会怎么办?这不是危言耸听,随着AIGC技术的飞速发展,这样的场景可能真的会出现。但是,别担心,今天我们就来聊聊&#xf…

云栖通道看AI产业应用,打开大模型的无限可能

9月19日-21日,2024云栖大会在杭州西湖区云栖小镇举行。20日,云栖通道如约开放。 这是一个为广大AI产业从业者、创业者以及大模型开发者提供的专属交流平台。来自教育、智能体应用、智能驾驶、人形机器人等多个AI应用领域的科学家、开发者、技术代表等现…

AI客服对决:智能客服PK赛揭示企业级AI应用未来

如今的AI对抗场景,简直成了颇具娱乐性的“观赏项目”。围观群众们不仅看得津津有味,时不时还会发出阵阵笑声。 最近,一场别开生面的AI客服挑战赛引发了热议:一位使用“花开富贵”阿姨人设的Agent甩出一条链接,结果对面…

WPF DataGrid 单元格居中,头部居中,点击行改变背景色。

我得全局样式都写在了App.XAML文件下的ResourceDictionary里&#xff0c;方便全局引用 DataGrid样式和点击改变行背景色的触发器(BasedOn继承的是UI框架的样式&#xff0c;若无则删除&#xff0c;触发器还有鼠标移动事件等&#xff0c;按需自行修改添加) <Style x:Key&quo…

Docker_基础初识

文章目录 初识Docker什么是虚拟化、容器化为什么要虚拟化、容器化&#xff1f;虚拟化实现方式应用程序执行环境分层虚拟化常见类别 常见虚拟化实现主机虚拟化(虚拟机)实现Hypervisor 容器虚拟化实现 namespace隔离实操基础知识dd命令语法参数 mkfs 命令语法参数 df 命令语法参数…

视觉距离与轴距离的转换方法

1.找一个明显的参照物&#xff0c;用上方固定的相机拍一下。保存好图片 2.轴用定长距离如1mm移动一下。 3.再用上相机再取一张图。 4.最后用halcon 将两图叠加 显示 效果如下 从图上可以明显的看出有两个图&#xff0c;红色标识的地方。 这时可以用halcon的工具画一个长方形…

深度学习-卷积神经网络(CNN)

文章目录 一、网络构造1. 卷积层&#xff08;Convolutional Layer&#xff09;&#xff08;1&#xff09;卷积&#xff08;2&#xff09;特征图计算公式&#xff08;3&#xff09;三通道卷积 2. 激活函数&#xff08;Activation Function&#xff09;3. 池化层&#xff08;Pool…

Elasticsearch不停机切换(上云)方案

如何给飞行中的飞机换引擎? 背景 业务背景 略 技术背景 线下集群40个索引左右&#xff0c;总数据量不大,不到100G因为ES承担的业务鉴权业务&#xff0c;所以不能接受停机割接 还有就是ES中数据来自各个业务方&#xff0c;推送的时机不定&#xff0c;也没有完备的重推机制&…

漏洞复现_永恒之蓝

1.概述 永恒之蓝&#xff08;EternalBlue&#xff09;是一个影响Windows操作系统的远程代码执行漏洞&#xff0c;编号为CVE-2017-0144&#xff0c;最初由美国国家安全局&#xff08;NSA&#xff09;开发并利用&#xff0c;后来被黑客组织Shadow Brokers泄露。该漏洞存在于SMBv…