python爬虫入门教程(一)

上一篇文章讲了爬虫的工作原理,这篇文章以后就要重点开始讲编程序了。

简单爬虫的的两个步骤:

  • 使用HTTPRequest工具模拟HTTP请求,接收到返回的文本。用于请求的包有: requests、urllib等。
  •  对接收的文本进行筛选,获取想要的内容。用户筛选文本的包有: bs4、lxml等。

爬虫的第一步就是向网站发送HTTP请求,本篇文章的主要内容就是用python向网站发送请求,获得网站的响应。

urllib库

在Python的网络编程世界中,urllib库是处理网络请求的基础库之一。无论是获取网页内容、下载文件还是发送POST请求,urllib都能提供强大的支持。

1. urllib库简介

urllib是Python标准库中的一个模块,用于处理网络请求。它包含多个子模块,如urllib.requesturllib.errorurllib.parse等,每个子模块都有其特定的功能和用途。下面我们将逐一介绍这些子模块的使用方法。

2. urllib.request模块

urllib.request模块用于打开和读取URLs。它提供了各种网络请求的类和函数,如urlopen()Request()等。

使用urlopen()发送GET请求

某度搜索页源代码部分展示:

运行结果展示:

使用Request()发送带有请求头的GET请求

什么是请求头?

请求头(Request Headers) 是HTTP请求的一部分,它包含了关于一个HTTP请求的属性信息。这些属性信息定义了请求的客户端环境、请求的意图以及请求的原始服务器应使用的其他属性。一个HTTP请求通常由请求行、请求头和请求体三部分组成,其中请求头包含了多个属性,每个属性包含一个名字和一个值,两者用冒号:分隔。

在某瓣电影官网按下F12进入开发者模式,点击网络,然后点击文档查看我们要爬取页面的接口,我们选择第一个,查看它的请求头。如下图:

这里做个解释:左边的一列其实就是网址的缩写,我们很明显可以看出来第一个就是我们输入的网址,也就是我们要发送HTTP请求的网址,右边就是它的请求头信息。

各种请求头信息:

  • User-Agent:告诉服务器关于客户端的环境信息,如浏览器类型、版本、操作系统、渲染引擎等。这有助于服务器返回与客户端兼容的内容。(经常放到程序中,一般使用的时候随便去网页里复制一个就行
  • Accept:Accept 请求头告诉服务器客户端能够处理哪些类型的响应内容,如text/htmlapplication/jsonimage/jpeg等。服务器将使用此信息来确定返回哪种类型的响应内容。
  • Accept-Encoding:Accept-Encoding 请求头列出了客户端支持的压缩编码类型,如gzipdeflate等。服务器可以使用这些编码来压缩响应,以减少传输的数据量。
  • Accept-Language:Accept-Language 请求头告诉服务器客户端首选的语言,以便服务器能够返回用该语言编写的响应内容。这有助于实现内容的国际化和本地化。

  • Content-Type:Content-Type 请求头(在POST或PUT请求中常见)描述了请求体的媒体类型。这告诉服务器请求体的内容格式,以便服务器能够正确地解析数据。例如,对于JSON数据,Content-Type可能设置为application/json

  • Content-Length:Content-Length 请求头告诉服务器请求体的长度(以字节为单位)。这对于需要知道请求体大小的服务器来说很有用。

  • Authorization:Authorization 请求头包含客户端提供给服务器的身份验证凭据,通常用于HTTP身份验证。例如,在基于令牌的认证中,客户端可能会将令牌作为此头的一部分发送。

  • Host:Host 请求头指定了请求的目标域名和端口号(如果端口号不是默认的80或443)。这允许服务器区分来自不同域名的请求,并在同一IP地址上托管多个网站。

  • Cache-Control:Cache-Control 请求头包含了关于请求缓存的指令。这些指令告诉缓存(如浏览器缓存或代理服务器缓存)如何缓存响应内容,以及何时可以重新验证缓存的内容。

  • Cookie:Cookie 请求头包含了由服务器之前设置的HTTP cookie。这些cookie可以用于会话管理、用户跟踪等目的。

除了上述常见的请求头之外,还有许多其他请求头,如Referer(指示请求的来源页面)、Connection(指定连接类型,如keep-alive)等。这些请求头根据具体的应用场景和需求而有所不同。

这部分不理解的话可以先跳过,知道请求头是用来伪装爬虫程序的就行了,后面实战遇到的时候会再给大家针对案例讲解。

为什么要加请求头?
  1. 身份认证:一些网站要求用户进行身份认证才能访问某些资源。请求头可以包含认证信息,如用户名和密码(虽然在现代应用中,这种做法通常会被更安全的方法如OAuth或JWT替代)。

  2. 缓存控制:请求头中的Cache-Control字段可以控制浏览器或其他客户端如何缓存请求的资源。例如,它可以指示服务器不要缓存某个资源,或者指示客户端在特定时间后重新验证缓存的资源。

  3. 内容协商:请求头中的Accept字段可以告诉服务器客户端能够处理哪些类型的响应内容。例如,客户端可以指定它期望接收HTML、XML、JSON或图片等类型的响应。

  4. 自定义请求:通过添加自定义的请求头,客户端可以向服务器传递额外的信息,以便服务器能够生成更符合客户端需求的响应。例如,一个API请求可能会包含一个表示API版本或客户端ID的自定义请求头。

  5. 跨域资源共享(CORS):在Web开发中,跨域资源共享(CORS)是一个安全特性,它允许网页从与其来源不同的源加载资源。CORS请求会包含一个名为Origin的请求头,该头字段用于描述请求的发起源。

  6. 防止缓存:通过在请求头中添加特定的字段(如Pragma: no-cacheCache-Control: no-cache),可以确保浏览器或其他客户端不会从缓存中加载资源,而是从服务器获取最新的资源。

  7. 追踪和调试:请求头还可以包含用于追踪和调试的信息,如用户代理(User-Agent)字段可以告诉服务器客户端的类型和版本信息。

比如某瓣电影的网页,假如我们没有加上请求头的话,向网站发送请求是会直接报错的(代码还是上面的代码,只换了一个网址)。如下图:

这时候我们就需要加上请求头来伪装我们的爬虫程序。一般情况下,我们只需要加上一个user-agent,来伪装我们是浏览器,而不是一个爬虫程序。所以我们要在代码中加上请求头,请求头里添加上user-agent伪装我们的程序。

运行结果:

官网源代码如下图:

发送POST请求

HTTP 的 POST 请求是用于提交数据到服务器进行处理的请求方法。与 GET 请求不同,POST 请求通常不会在 URL 中包含数据,而是将数据包含在请求体中。这使得 POST 请求更适合于发送大量数据或敏感数据(如密码),因为数据不会在 URL 中暴露。还有比如大部分网页点赞或者评论等等都是post请求。

我们用下面这个网站来测试post请求。

运行结果如下(可以看到在form表单里有我们发送的数据。):

3. urllib.error模块

urllib.error模块用于处理urllib.request模块抛出的异常。当网络请求出现错误时,如连接超时、服务器无响应等,urllib.request会抛出异常,这时可以使用urllib.error模块中的异常类来捕获和处理这些异常。

4. urllib.parse模块

urllib.parse模块提供了处理URL的功能,如解析URL、构建查询参数等。

上面已经用过urlencode()这个方法了,接下来再说一下quote()和unquote()方法。

quote()对url地址中的中文进行编码,类似于urlencode()方法。

unquote()对url地址进行解码,将编码后的字符串转为普通的Unicode字符串。

data = '%E5%92%8C%E5%B9%B3'
result = parse.unquote(data)
print(result)  # 运行结果: 和平

requests库

requests库支持各种HTTP请求方法,包括GET、POST、PUT、DELETE等,功能非常强大,也是我们写爬虫程序中最常用的库,下面来介绍一些它的使用方法。首先安装requests库,终端输入:pip install requests

注意:由于上面讲urllib库的时候已经讲过get请求,post请求等讲过的我就不讲了,直接教大家使用这个第三方库,有不同的地方我再讲。

1. 发送GET请求

响应头(Response Headers)包含了关于服务器如何处理请求和返回资源的元数据。这些响应头对于调试、了解资源属性和配置缓存等非常有用。响应头信息用response对象的headers属性就可以获取。

2. 发送POST请求

3. 设置请求头

4. 处理JSON数据

当服务器返回JSON格式的数据时,我们可以使用response.json()方法将其直接解析为Python对象,这样就不需要使用python中的json库来把字符串转为python中的对象了。

不了解json数据的可以这样理解:用了json方法后,长的和python中列表或者字典一样的字符串就转变为了列表或者字典,可以让我们直接用python方法提取信息。

今天就先讲到这里,下一篇文章会讲一下requests库的更多用法,包括会话保持(Session)、SSL证书验证、文件上传、代理设置等稍微高级一点的用法。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++题解】1265. 爱因斯坦的数学题

问题:1265. 爱因斯坦的数学题 类型:简单循环 题目描述: 爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨 2 阶,则最最后剩一阶,若每步跨 3 阶,则最后剩 2 阶,若每…

【CS.DB】深度解析:ClickHouse与Elasticsearch在大数据分析中的应用与优化

文章目录 《深入对比:在大数据分析中的 ClickHouse和Elasticsearch》 1 介绍 2 深入非关系型数据库的世界2.1 非关系型数据库的种类2.2 列存储数据库(如ClickHouse)2.3 搜索引擎(如Elasticsearch)2.4 核心优势的归纳 3…

【MYSQL系列】mysql中text,longtext,mediumtext区别

【MYSQL系列】mysql中text,longtext,mediumtext区别 在MySQL数据库中,TEXT、LONGTEXT和MEDIUMTEXT都是用于存储大量文本数据的字段类型。它们之间的主要区别在于可存储的数据大小和性能方面的差异。本文将探讨这些字段类型的特点、使用场景和一些最佳实践。 TEXT类…

在UI界面中实现3d人物展示

简要原理(设置双摄像机): 为需要展示的3D人物单独设置一个摄像机(只设置为渲染人物层级),主要摄像机的方向与人物方向一致,但摄像机需要需要旋转180,设置的角度自行进行微调创建一个…

spark-3.5.1+Hadoop 3.4.0+Hive4.0 分布式集群 安装配置

Hadoop安装参考: Hadoop 3.4.0HBase2.5.8ZooKeeper3.8.4Hive4.0Sqoop 分布式高可用集群部署安装 大数据系列二-CSDN博客 一 下载:Downloads | Apache Spark 1 下载Maven – Welcome to Apache Maven # maven安装及配置教程 wget https://dlcdn.apache.org/maven/maven-3/3.8…

Tomcat相关概述和部署

目录 一、Tomcat知识 1.Tomcat概述 2.Tomcat组件构成 3.Tomcat 功能组件结构 4.Tomcat的请求过程 二、tomcat服务部署 1.老样子准备工作——关闭防火墙和selinux,防止其对安装过程的干扰 2.将准备好的软件包拖入/opt目录下,进行安装JDK 3.设置J…

Android 常用开源库 MMKV 源码分析与理解

文章目录 前言一、MMKV简介1.mmap2.protobuf 二、MMKV 源码详解1.MMKV初始化2.MMKV对象获取3.文件摘要的映射4.loadFromFile 从文件加载数据5.数据写入6.内存重整7.数据读取8.数据删除9.文件回写10.Protobuf 实现1.序列化2.反序列化 12.文件锁1.加锁2.解锁 13.状态同步 总结参考…

python数据分析-ZET财务数据分析

一、公司背景 中兴通讯股份有限公司是一家总部位于中国深圳的跨国公司,致力于为全球客户提供通信设备和解决方案。公司成立于1985年,自成立以来一直致力于为客户提供创新的通信技术和服务。中兴通讯的业务涵盖多个领域,包括但不限于高端路由…

kube-promethesu新增k8s组件监控(etcd\kube-controller-manage\kube-scheduler)

我们的k8s集群是二进制部署,版本是1.20.4 同时选择的kube-prometheus版本是kube-prometheus-0.8.0 一、prometheus添加自定义监控与告警(etcd) 1、步骤及注意事项(前提,部署参考部署篇) 1.1 一般etcd集群会开启HTTP…

【Jmeter】性能测试之压测脚本生成,也可以录制接口自动化测试场景

准备工作-10分中药录制HTTPS脚本,需配置证书 准备工作-10分中药 以https://www.baidu.com/这个地址为录制脚本的示例。 录制脚本前的准备工作当然是得先把Jmeter下载安装好、JDK环境配置好、打开Jmeter.bat,打开cmd,输入ipconfig,…

PowerDesigner遍历导出所有表结构到Excel

PowerDesigner遍历导出所有表到Excel 1.打开需要导出表结构到Excel的pdm文件 2.点击Tools|Execute Commands|Edit/Run Script菜单或按下快捷键Ctrl Shift X打开脚本窗口,输入示例VBScript脚本,修改其中的Excel模板路径及工作薄页签,点Run…

【启程Golang之旅】协程和管道操作

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…

驱动开发之设备树语法

目录 0.设备树由来 1.设备树概念 1.1.DTS、DTB 和 DTC 和 dtsi 概念 2.设备树语法 2.1.例子 2.2.设备节点 2.2.1.节点命名 2.2.2节点数据类型 2.2.3.根节点 2.2.4.属性介绍 2.2.4.1.compatible属性 2.2.4.2.name属性 2.2.4.3.status 属性 2.2.4.5.unit-address属性…

2024050302-重学 Java 设计模式《实战享元模式》

重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」 一、前言 程序员👨‍💻‍的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只要自己把这部分需求…

apifox 生成签名

目录 前言准备编写签名脚本签名说明捋清思路编码获取签名所需的参数生成签名将签名放到合适的位置完整代码 在apifox中配置脚本新增公共脚本引用公共脚本添加环境变量 参考 前言 略 准备 查看apifox提供的最佳实践文章:接口签名如何处理 编写签名脚本 签名说明…

【遗传算法】【机器学习】【Python】常见交叉方法(二)、多点交叉和均匀交叉

往期遗传算法文章见: 【遗传算法】【机器学习】【Python】常见交叉方法(一)、单点交叉和两点交叉 一、遗传算法流程图 交叉过程即存在于上图的”交叉“(crossover)步骤中。 二、多点交叉 多点交叉的原理就是&#x…

腾讯云centos上安装docker

下面的操作是在root用户下操作的,如果非root用户在命令行前加上sudo 1. 系统及内核查看 操作系统:64位的CentOS 7或更新版本。内核版本:最低要求是3.10,推荐使用3.10或更高版本。 #查看内核版本 (base) [klfwjfweaVM-0-6-centos ~]$ uname…

ARM服务器在云手机中可以提供哪些支持

ARM服务器作为云手机的底层支撑,在很多社媒APP或者电商APP平台都有着很多看不见的功劳,可以说ARM扮演着至关重要的底层支持角色; 首先,ARM 服务器为云手机提供了强大的计算能力基础。云手机需要处理大量的数据和复杂的运算&#x…

uniapp自定义的下面导航

uniapp自定义的下面导航 看看效果图片吧 文章目录 uniapp自定义的下面导航 看看效果图片吧 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6aa0e964741d4dd3a58f4e86c4bf3247.png) 前言一、写组件、我这里就没有写组件了直接写了一个页面?总结 前言 在…

一文掌握Vue3:深度解读Vue3新特性、Vue2与Vue3核心差异以及Vue2到Vue3转型迭代迁移重点梳理与实战

每次技术革新均推动着应用性能与开发体验的提升。Vue3 的迭代进步体现在性能优化、API重构与增强型TypeScript支持等方面,从而实现更高效开发、更优运行表现,促使升级成为保持竞争力与跟进现代前端趋势的必然选择。本文深度解读Vue3 响应式数据data、生命…