当前位置: 首页 > article >正文

Python爬虫之urllib模块详解

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.kler.cn/a/322603.html

相关文章:

  • 【学习笔记】科学计算
  • 【原创】如何备份和还原Ubuntu系统,非常详细!!
  • Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC
  • 【机器学习】聚类算法原理详解
  • 2020年计挑赛往届真题(C++)
  • RT-Thread 星火1号学习笔记
  • 通过 GitLab API 实现 CHANGELOG.md 文件的自动化上传至指定分支
  • GS-SLAM论文阅读笔记--GLC-SLAM
  • 3D建模:Agisoft Metashape Professional 详细安装教程分享 Mac/win
  • Word:表格公式计算
  • 单细胞Seruat和h5ad数据格式互换(R与python)方法学习和整理
  • string类模拟实现
  • 4.V2X技术
  • 前端开发之装饰器模式
  • 将图片资源保存到服务器的盘符中
  • LLaMA-Factory 使用 sharegpt 格式的数据集
  • nacos 快速入门
  • 【如何学习操作系统】——学会学习的艺术
  • 简单上手vue使用vue-plugin-hiprint进行打印
  • 【FastAPI】使用 SQLAlchemy 和 FastAPI 实现 PostgreSQL 中的 JSON 数据 CRUD 操作
  • 【线程】POSIX信号量---基于环形队列的生产消费者模型
  • windows10使用bat脚本安装前后端环境之msyql5.7安装配置并重置用户密码
  • Meta震撼发布Llama3.2大规模模型
  • 记录QTreeView使用(item勾选,事件,过滤)
  • cubemx配置ADC
  • [3]Opengl ES着色器