Python爬虫之urllib模块详解

ops/2024/9/23 6:36:29/

Python爬虫入门

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

urllib模块

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

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

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

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

python">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进行编码处理。

python">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
根据上述,修复代码:

python">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

下面就来试试吧

python">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
在这里插入图片描述
代码如下:

python">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.ppmy.cn/ops/114632.html

相关文章

Spring Mybatis 基本使用 总结

1. 简介 Mybatis库可以简化数据库的操作&#xff0c;专注于sql语句。 2.搭建步骤 2.1 在pom.xml引入mybatis <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version> </dep…

4.《DevOps》系列K8S部署CICD流水线之Helm部署Harbor私人镜像仓库

架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署GitLab、Jenkins helm安装方式参考3.《DevOps》系列K8S部…

如何在 UniApp 中实现地图的视野自适应?

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

C++和OpenGL实现3D游戏编程【连载10】——纹理的半透明显示

1、本节实现的内容 上一节课我们讲到了图片的镂空显示,它能在显示图片时去除指定颜色的背景,那么这节课我们来说一下图片的半透明显示效果,半透明效果能给画面带来更高质量的提升,使图片显示的更自然,产生更真实的效果。下面是一个气泡向上漂浮的效果。 气泡效果 2、非纹…

Spring Cloud Alibaba-(5)Seata【分布式事务】

Spring Cloud Alibaba-&#xff08;1&#xff09;搭建项目环境 Spring Cloud Alibaba-&#xff08;2&#xff09;Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-&#xff08;3&#xff09;OpenFeign【服务调用】 Spring Cloud Alibaba-&#xff08;4&#xff09;Sen…

【Proteus仿真】基于51单片机的宠物喂食系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;两个按键调整重量阈值的大小&#xff0c;如果mpx4117压力传感器测重没超过阈值&#xff0c; 则电机转动&#xff0c;表示投喂&#xff0c;蜂鸣器发出滴滴声&#xff0c;如…

计算机毕业设计springboot+vue高校教学实施评教系统springcloud微服务分布式

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行需求分析系统设计软件测试核心代码部分展示详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …