Python爬虫之urllib模块详解

server/2024/9/23 6:38:36/

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/server/120675.html

相关文章

算法打卡:第十一章 图论part04

今日收获:字符串接龙,有向图的完全可达性,岛屿的周长 1. 字符串接龙 题目链接:110. 字符串接龙 (kamacoder.com) 思路:广度优先遍历适合解决两个点之间的最短路径问题,通常使用队列模拟一圈圈遍历。 &a…

Vue(15)——组合式API②

生命周期函数 选项式组合式beforeCreate/createdsetupbeforeMountonBeforeMount mountedonMounedbeforeUpdateonBeforeUpdateupdatedonUpdatedbeforeUnmountonBeforeUnmountunmountedonUnmounted 父子通信 父传子基本思想: 父组件中给子组件绑定属性…

【鼠标滚轮专用芯片】KTH57913D 霍尔位置传感器

KTH5791 3D 霍尔位置传感器 -- 鼠标滚轮专用芯片 KTH5791AQ3QNS 产品概述 KTH5791 是一款基于 3D 霍尔磁感应原理的鼠标滚轮专用芯片,主要面向鼠标滚轮的旋转的应用场景。两个专用的正交输出使该产品可直接替代机械和光学旋转编码器的输出方式,使得鼠标…

计算机毕业设计Python深度学习房价预测 房价可视化 链家爬虫 房源爬虫 房源可视化 卷积神经网络 大数据毕业设计 机器学习 人工智能 AI

《Python房价预测系统》开题报告 一、选题背景与意义 1.1 选题背景 随着城市化进程的加速和居民生活水平的提高,房地产市场成为全球经济发展的重要驱动力之一。房价作为房地产市场的重要指标,不仅关系到国家经济安全,也直接影响广大人民群…

清空当前机器所有Docker容器和镜像

sudo docker stop $(sudo docker ps -aq) sudo docker rm $(sudo docker ps -aq) sudo docker rmi $(sudo docker images -q)删除当前机器上的所有Docker镜像是一个高风险操作,因为它会删除所有镜像,包括那些可能正在被容器使用的镜像。在执行此操作之前…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 内存分配和回收规则

文章目录 垃圾回收机制堆空间的基本结构内存分配和回收规则对象优先在 Eden 区分配分配担保机制 大对象直接进入老年代长期存活的对象进入老年代主要进行 GC 的区域部分收集 (Partial GC):Minor GCMajor/Old GCMixed GC 整堆收集(Full GC) 空…

Nginx 负载均衡:优化网站性能与可扩展性的利器

在当今高流量的互联网时代,网站的性能和可扩展性成为了衡量其成功与否的关键因素之一。随着用户量的不断增加,单一服务器往往难以承受巨大的访问压力,这时就需要引入负载均衡技术来分散请求,提高系统的整体性能和可靠性。Nginx&am…

计算机网络第二章(部分)

R1. 五种非专用的因特网应用及它们所使用的应用层协议: 电子邮件 (Email) - 使用 SMTP(简单邮件传输协议)文件传输 (File Transfer) - 使用 FTP(文件传输协议)网页浏览 (Web Browsing) - 使用 HTTP/HTTPS(超文本传输协…