python网络爬虫实战教学——urllib的使用(1)

news2024/11/25 10:27:22

在这里插入图片描述

文章目录

  • 专栏导读
  • 1、前言
  • 2、urllib的使用
  • 3、发送请求
    • 3.1 urlopen
    • 3.2 request

专栏导读

✍ 作者简介:i阿极,CSDN 数据分析领域优质创作者,专注于分享python数据分析领域知识。

本文录入于《python网络爬虫实战教学》,本专栏针对大学生、初级数据分析工程师精心打造,对python基础知识点逐一击破,不断学习,提升自我。
订阅后,可以阅读《python网络爬虫实战教学》中全部文章内容,包含python基础语法、数据结构和文件操作,科学计算,实现文件内容操作,实现数据可视化等等。
✍ 其他专栏:《数据分析案例》 ,《机器学习案例》

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

1、前言

❓学习爬虫’其基本的操作便是模拟测览器向服务器发出请求’那么我们需要从哪个地方做起呢?
❓请求需要我们自己构造吗?
❓我们需要关心请求这个数据结构怎么实现吗?
❓需要了解HTTP`TCP`IP层的网络传输通信吗?需要知道服务器如何响应以及响应的原理吗?

😍可能你无从下手’不过不用担心,Python的强大之处就是提供了功能齐全的类库来帮助我们实现这些需求°最基础的HTTP库有urlljb、Iequ≈ts、httpx等°
😍拿urllib这个库来说’有了它’我们只需要关心请求的链接是什么’需要传递的参数是什么’以及如何设置可选的请求头,而无须深人到底层去了解到底是怎样传输和通信的°有了urllib库’只用两行代码就可以完成_次请求和响应的处理过程’得到网页内容,是不是感觉方便极了?
👇接下来’就让我们从最基础的部分开始了解HTTP库的使用方法吧。

2、urllib的使用

首先介绍一个Python库叫作urllib,利用它就可以实现HTTP请求的发送,而且不需要关心HTTP协议本身甚至更底层的实现,我们要做的是指定请求的URL`请求头`请求体等信息。此外urlljb还可以把服务器返回的响应转化为Python对象,我们通过该对象便可以方便地获取响应的相关信息’如响应状态码、响应头、响应体等。

ps:在Python2中,有urllib和urllib2两个库来实现HTTP请求的发送。而在 Python3中,urllib2库已经不存在了,统一为了 urllib。

首先,我们了解一下 urllib 库的使用方法,它是 Python 内置的 HTTP请求库,也就是说不需要额外安装,可直接使用。urllib 库包含如下4个模块。

👉request:这是最基本的 HTTP 请求模块,可以模拟请求的发送。就像在浏览器里输人网址然后按下回车一样,只需要给库方法传入 URL以及额外的参数,就可以模拟实现发送请求的过程了。

👉error:异常处理模块。如果出现请求异常,那么我们可以捕获这些异常,然后进行重试或其他操作以保证程序运行不会意外终止。

👉parse:一个工具模块。提供了许多 URL的处理方法,例如拆分、解析、合并等。

👉robotparser:主要用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可
以,它其实用得比较少。

3、发送请求

使用urllib库的request模块可以方便地发送请求并得到响应。我们先来看下它的具体用法。

3.1 urlopen

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用这个模块可以模拟浏览器的请求发起过程,同时它还具有处理授权验证(Authentication)、重定向(Redirection)、浏览器 Cookie 以及其他一些功能。

下面我们体会-下 request 模块的强大之处。这里以 Python 官网为例,我们把这个网页抓取下来:

import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(response.read().decode("utf-8"))

ps:如果上述代码报错为”utf-8“时,可用下述代码。

import urllib.request  
import gzip  
from io import BytesIO  
#创建一个请求对象  
request = urllib.request.Request('https://python.org')    
#发起请求并获取响应对象  
response = urllib.request.urlopen(request)    
#检查响应头以确认内容是否被 gzip 压缩  
if response.info().get('Content-Encoding') == 'gzip':  
    # 读取压缩的响应数据  
    compressed_data = response.read()       
    # 使用 gzip 解压缩  
    gzip_stream = gzip.GzipFile(fileobj=BytesIO(compressed_data), mode='rb')  
    decoded_data = gzip_stream.read().decode('utf-8')       
    # 打印解码后的数据  
    print(decoded_data)  
else:  
    # 如果没有被 gzip 压缩,直接解码  
    print(response.read().decode('utf-8'))`

运行结果如图所示

在这里插入图片描述

这里我们只用了两行代码’便完成了Python官网的抓取,输出了其网页的源代码。得到源代码之后’我们想要的链接`图片地址`文本信息不就都可以提取出来了吗?

接下来,看看返回的响应到底是什么。利用type方法输出响应的类型:

import urllib.request
response = urllib.request.urlopen("https://www.python.org")
print(type(response))

输出结果如下:

<class 'http.client.HTTPResponse'>

可以看出,响应是一个HTTPResposne 类型的对象,主要包含read、readinto、getheader、getheaders、fileno 等方法,以及msg、version、status、reason、debuglevel、closed 等属性。得到响应之后,我们把它赋值给response 变量,然后就可以调用上述那些方法和属性,得到返回结果的一系列信息了。

例如,调用 read 方法可以得到响应的网页内容、调用 status 属性可以得到响应结果的状态码(200 代表请求成功,404代表网页未找到等)。

下面再通过一个实例来看看:

import urllib.request  
response = urllib.request.urlopen("https://www.python.org")
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))

运行结果如下:
在这里插入图片描述

其中前两个输出分别是响应的状态码和响应的头信息;最后一个输出是调用 getheader 方法,并传人参数 Server,获取了响应头中 Server 的值,结果是 nginx,意思为服务器是用 Nginx 搭建的。利用最基本的 urlopen方法,已经可以完成对简单网页的 GET请求抓取。

❓如果想给链接传递一些参数,又该怎么实现呢?

👉首先看一下urlopen 方法的 API:

urllib,request.urlopen(url,data=None,[timeout,]*,cafile=NOne,capath=None,,cadefault=False,context=None)

可以发现,除了第一个参数用于传递 URL之外,我们还可以传递其他内容,例如 data(附加数据)、timeout(超时时间)等。

3.2 request

利用 urlopen方法可以发起最基本的请求,但它那几个简单的参数并不足以构建一个完整的请求。如果需要往请求中加人 Headers 等信息,就得利用更强大的 Request 类来构建请求了。

💪首先,我们用实例感受一下 Request 类的用法:

import urllib.request
request =urllib.request.Request('https://python.org')
response =urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

在这里插入图片描述
可以发现,我们依然是用urlopen方法来发送请求,只不过这次该方法的参数不再是URL,而是一个 Request 类型的对象。通过构造这个数据结构,一方面可以将请求独立成一个对象,另一方面可更加丰富和灵活地配置参数。

下面我们看一下可以通过怎样的参数来构造 Request类,构造方法如下:

class urllib.request.Request(url,data=None, headers={},origin_req_host=None, unverifiable=False, method=None)

第一个参数 url用于请求 URL,这是必传参数,其他的都是可选参数。

第二个参数 data如果要传数据,必须传 bytes 类型的。如果数据是字典,可以先用urllib.parse模块里的 urlencode 方法进行编码。

第三个参数 headers是一个字典,这就是请求头,我们在构造请求时,既可以通过 headers 参数直接构造此项,也可以通过调用请求实例的 add header 方法添加。添加请求头最常见的方法就是通过修改User-Agent来伪装测览器。默认的User-Agent是Python-ur1lib,我们可以通过修改这个值来伪装浏览器。例如要伪装火狐浏览器,就可以把 User-Agent设置为:

Mozilla/5.0(X11;U;Linux i686)Gecko/20071127 Firefox/2.0.0.11

第四个参数 origin reg host 指的是请求方的 host 名称或者 IP 地址。

第五个参数 unverifiable 表示请求是否是无法验证的,默认取值是 False,意思是用户没有足够的权限来接收这个请求的结果。例如,请求一个HTML文档中的图片,但是没有自动抓取图像的权限这时 unverifiable 的值就是 True。

第六个参数 method 是一个字符串,用来指示请求使用的方法,例如 GET、POST 和 PUT 等。

📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

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

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

相关文章

支付宝小程序一次性订阅requestSubscribeMessage授权和操作详解

一、授权 — requestSubscribeMessage my.requestSubscribeMessage({entityIds: [xxxx],success: (res) > {console.log("success回调", res)},fail: res > {console.log(fail回调, res)} })success 回调函数 behavior String 用户订阅操作结果 — subscribe …

【译】矢量数据库 101 - 什么是矢量数据库?

原文地址&#xff1a;Vector Database 101 - What is a Vector Database? 1. 简介 大家好——欢迎回到 Milvus 教程。在上一教程中&#xff0c;我们快速浏览了每天产生的日益增长的数据量。然后&#xff0c;我们介绍了如何将这些数据分成结构化/半结构化数据和非结构化数据&…

【python】Matplotlib库安装教程

1.你要有python&#xff08;如果没装可以看这篇文章文章安装&#xff09; python及pycharm安装教程&#xff08;2024超详细&#xff09; 2.更新pip&#xff08;此步可跳过&#xff09; win R &#xff1b;输入cmd&#xff08;就是打开命令提示符&#xff09; 打开后&#x…

【Linux】传输层协议:TCP/UDP

目录 netstat pidof UDP协议 TCP协议 TCP协议段格式 TCP协议的相关机制 确认应答&#xff08;ACK&#xff09;机制 超时重传机制 连接管理机制 服务端状态转换 客户端状态转化 流量控制 流量控制常见问题&#xff1a; 滑动窗口 拥塞控制 延迟应答 面向字节流…

electron-builder 打包问题,下载慢解决方案

目录 问题说明设置下载源 &#xff1f;解决方案思路下载Electron下载winCodeSign下载nsis下载nsis-resources 总结 问题说明 项目使用了Electron&#xff0c;在第一次打包时会遇见下载慢&#xff0c;导致打包进度几乎停滞不前&#xff0c;甚至可能直接报错 其实这是因为Electr…

UML学习体会

1. 水在前面 本来写作的水平就很一般&#xff0c;平时写的也少。最近看到一些文章说学习最好的方式是输出&#xff0c;刚好又重温了一遍UML方面的基础&#xff0c;所以想记录点学习心得。而且说实话这玩意平时基本不怎么用&#xff08;偶尔倒是看看别人的成果&#xff09;&…

智能客服知识库如何搭建比较方便?教程奉上!

随着科技的进步&#xff0c;人工智能已深入到我们日常生活的各个角落。在客服行业里&#xff0c;智能客服知识库的出现&#xff0c;不仅极大地减轻了客服人员的工作负担&#xff0c;还提升了用户的服务体验。那么&#xff0c;怎样才能建立一个方便和实用的智能客服知识库呢&…

Acwing.167 木棒(回溯)

题目 乔治拿来一组等长的木棒&#xff0c;将它们随机地砍断&#xff0c;使得每一节木棍的长度都不超过 50 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态&#xff0c;但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序&#xff0c;帮助乔治计算木棒…

【马斯克开源GROK-1模型】意味着什么?

目录 1.激动人心的消息 Grok-1 根据 Apache License 2.0 开放源代码 题外话-介绍JAX框架 2.grok-1模型参数介绍 3.推理grok-1模型需要多大显存&#xff1f; 4.grok-1开源意味着什么&#xff1f; 5.最后&#xff0c;让我们一同期待开源grok-1模型的训练代码&#xff01;…

电脑内存取证

目录 电脑内存文件与volatility工具获取电脑用户名获取程序最后一次运行的时间总结 电脑内存文件与volatility工具 这个文件就是内存文件 提取内存信息&#xff0c;我们一般采用volatility工具进行提取&#xff0c;具体如何安装和使用&#xff0c;直接去网上搜索就可以了 获取…

力扣Lc18--- 168. Excel表列名称(java版)-2024年3月19日

1.题目描述 2.知识点 因为是输入字符 然后显示数字。 就类似2进制10代表2&#xff0c;110代表4&#xff0c;用某进制次幂的方式返回最后的数字结果。 3.代码实现 class Solution {public int titleToNumber(String columnTitle) {int sum0;for(int i0;i<columnTitle.len…

大数据架构技术选型

OLAP数据库选型对比&#xff1a; AnalyticDB(阿里&#xff09;、Hologres&#xff08;阿里&#xff09;、Doris、StarRocks、ClickHouse、Hbase AnalyticDB MySQL 技术架构 Adb是融合数据库、大数据技术于一体的云原生企业级数据仓库服务、支持高吞吐的数据实时增删改查低延时…

企业合规视角下的恒大地产财务造假案深度剖析

当幕布被拉开&#xff0c;真相暴露在聚光灯下&#xff0c;近日中国房地产市场的巨头恒大地产因财务造假被中国证监会严厉处罚&#xff0c;引起了公众和市场的强烈震动。这份重量级的罚单&#xff0c;不仅以41.75亿元的天价罚款单给恒大地产记下了沉重的一笔&#xff0c;更是将包…

数据仓库相关概述

数据仓库概述 数据仓库概念 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据&#xff0c;借助数据仓库的分析能力&#xff0c;企业可从数据中获得宝贵的信息进而改进决策。同时&#xff0c;随着时间的推移&#xff0c;数据仓…

IDEA Git恢复DropCommit删除的提交

刚刚Dorp commit了&#xff0c;本地代码也被删除了&#xff0c;如何恢复呢&#xff0c; 从项目中登录git&#xff0c;找到刚刚的commit代码&#xff0c;如下所示&#xff1a;输入命令git reflog 复制代码&#xff0c;到idea中&#xff0c;打开GIt&#xff0c;找到RESET HEAD, …

【数据可视化】使用Python + Gephi,构建中医方剂关系网络图!

代码和示例数据下载 前言 在这篇文章中&#xff0c;我们将会可视化 《七版方剂学》 的药材的关系&#xff0c;我们将使用Python制作节点和边的数据&#xff0c;然后在Gephi中绘制出方剂的网络图。 Gephi是一个专门用于构建网络图的工具&#xff0c;只要你能提供节点和边的数…

Android StateLayout状态页

文章目录 Android StateLayout状态页概述源码使用源码下载 Android StateLayout状态页 概述 StateLayout&#xff08;状态页&#xff09;包含&#xff1a;加载中页面&#xff0c;错误页面&#xff0c;空页面&#xff0c;内含状态默认页面&#xff0c;支持自定义页面。 源码 …

如何在SpringCloud2023中快速集成注册中心

你好&#xff0c;这里是codetrend专栏“SpringCloud2023实战”。欢迎点击关注查看往期文章。 注册中心在前文提到有很多选型&#xff0c;在这里以Spring Cloud Zookeeper为例说明注册中心的集成和使用。 选择Spring Cloud Zookeeper作为注册中心原因如下&#xff1a; 依赖更少…

水电能源智能化监控系统

水电能源智能化监控系统是利用现代信息技术&#xff0c;对水电站的运行状态、设备性能、环境参数等进行实时监测和管理的一种智能化系统。随着我国水电能源事业的快速发展&#xff0c;水电能源智能化监控系统在水电能源行业中的应用越来越广泛&#xff0c;为我国水电能源事业的…

用Python的turtle库绘制皮卡丘

turtle库的简介 turtle(海龟)库是turtle绘图体系的python实现&#xff0c;turtle库是一种标准库&#xff0c;是python自带的。 turtle(海龟)是一种真实的存在&#xff0c;有一个海龟在窗口的正中心&#xff0c;在画布上游走&#xff0c;走过的轨迹形成了绘制的图形&#xff0…