干货:一文讲通Python爬虫的基本原理

Python中一个应用广泛的方向就是爬虫。

今天就给大家讲讲爬虫的原理,并举个小案例说明爬虫的流程。

1、什么是爬虫?

我们日常浏览的文字、图片、视频等数据是在别人服务器上的,通过网络传输到浏览器展示给我们看,那如果我们想把浏览器上展示的数据存放到本地怎么办呢?

少量的我们可以复制粘贴,那多了呢?此时就体现出了代码的魅力

可以把整个互联网想象成一张数据网,而我们编写的代码的工作就是从这个数据网上获取我们需要的信息,存储下来。
在这里插入图片描述

2、爬虫的原理

一句话:代替浏览器去向服务器要数据

平常我们获取数据流程是这样的:
在这里插入图片描述
流程:告诉浏览器要看啥—浏览器找服务器要—服务器给浏览器要的数据—浏览器呈现给你。

可以看到最后你需要的数据就来到了浏览器手中。

那写了爬虫代码之后是这样的:
在这里插入图片描述
爬虫代码直接替代了浏览器的角色,最后数据跑到了爬虫代码手中,那爬虫代码的不就是你的嘛。

3、爬虫代码的构成

上面说了,爬虫是替代的浏览器的角色,帮我们找服务器要数据的。

既然是替代,那就得易容的很像浏览器,不然服务器一眼看出你是披着羊皮的狼,肯定不会开门把数据给你。

所以编写整个爬虫代码的核心就是:

把自己打扮的像浏览器,包括穿着打扮,一言一行,越像越好。

那既然要像浏览器,就得知道浏览器找服务器要数据的时候穿啥样,需不需要身份证明啥的,这就是请求的构造部分。

任意网页,点击F12—刷新下网页—Nerwork—Headers,就可以看到浏览器发送的请求
在这里插入图片描述
当你的请求得到了服务器的认可,他就会把数据包给你。

随便选一个网页,右键查看源代码就可以看到数据的样子。
在这里插入图片描述
在这里插入图片描述
可以看到,源数据密密麻麻,我们把需要的数据提取出来即可。

4、爬虫的难点

实际在浏览器和服务器交流的时候,浏览器的请求以及服务器的回复是非常多的。
在这里插入图片描述
这个我们通过F12开发者工具就可以看到,左侧的Name一栏就是浏览器与服务器的交互记录。
在这里插入图片描述
可以看到记录很多,而且不同的交互记录中,浏览器的请求数据和方式是不同的,没法一概而论。

所以难的就在于,我们如何从这些交互记录中找到带有我们需要数据的那几条。

然后才能模仿浏览器在获取目标数据时发送的请求,通过爬虫来构造去获取数据。

5、找记录

上面说了我们需要找到带有我们需要数据的交互记录。

那最笨的方法就是一条条的记录去看,别笑,对简单网页这方法最常用。

因为通常的静态网页中,浏览器直接能看到的主要内容都在第一条记录中了。

并且这条记录的Headers中的请求的URL就是我们网页的URL(最重要判断方式)
在这里插入图片描述
本篇文章中也只说这一种,其他方法都比较复杂,有空再述~

怎么识别该条记录中包含的数据?

方法:F12后—刷新一下—Network—点击任意记录—Preview/Response
在这里插入图片描述
一般建议Preview看即可,这是浏览器渲染过的,容易查看;

Response下的是html格式,不容易查看。

OK,这样就找到了我们需要数据的记录。

6、模仿构造请求

找到目标记录后,我们就开始用代码模仿浏览器进行请求

打开记录的Headers,就可以看到浏览器请求时发送给服务器的数据。
在这里插入图片描述
可以看到数据很多,而我们也不需要全都模仿,只需要模拟几个最重要的数据。

主要是:

URL:请求的网址(对应了服务器的数据存放位置)

Method:请求方式,常用get(不需要带数据),post(需要带数据)

User-Agent: 浏览器的标识,相当于爬虫的衣服。

Cookie(简单的可有可无)

对应到本案例中:

URL:

https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180

Method:get

User-Agent:Headers最底部

在这里插入图片描述
OK,明确了以上需要的请求数据,我们就开始写代码了。

7、用代码请求数据

需要用到的库是requests库

没有的安装即可:

pip install requests

把我们的url和User-Agent直接复制过来准备好:

headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36',
}
url='https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180'

请求方式为get,所以使用requests的get方法进行请求构造即可。

response=requests.get(url,headers=headers)

最后打印出text即可。

print(response.text)

完整代码如下:

import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36',
}
url='https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180'
response=requests.get(url,headers=headers)
print(response.text)

在这里插入图片描述
可以看到,获取的数据和我们浏览器右键查看网页源代码是一样的内容
在这里插入图片描述
就说明我们成功把该条记录的数据爬取了下了。剩下的就是数据的清洗、提取和保存工作了。

内容过多,此篇就不展开了,留个坑,后续补上~

有所收益的话,欢迎点赞关注,感谢支持,持续更新~

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

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

相关文章

【Java】文件路径-绝对路径与相对路径

1、绝对路径与相对路径 先来看一下绝对路径和相对路径的定义: 绝对路径是指完整的描述文件位置的路径就是绝对路径。如Windows系统中的D:\Project\data\test.txt,MAC系统中的/Users/liuwenwen/Desktop/Project/test.txt 相对路径是指相对于当前文件位置…

CentOS 8 安装国内、本地YUM源

环境:windows 11、 VMware 17、Cent OS 8 目的:加快软件下载速度 1、国内YUM源安装 使用国外的源,速度卡到不显示 备份默认YUM源文件 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# mkdir yum.bak [rootlocalho…

vue项目---vue路由操作

目录 202221336029-网安2211 1.基础路由的挂载 1.封装到文件 2.路由器的基本操作 1.高亮显示 高亮实现 高亮显示与模糊匹配 自定义高亮名称 2.导航传参 1.静态传参 2.动态传参 3.可选符号: 3.总结: 202221336029-网安2211 1.基础路由的挂载 …

c++之STL

首先我们来仔细研究string 首先我们需要实现string的构造函数和析构函数。有new就有delete. 然后我们实现size()和c_str(),其中c_str就是可以将string类型转换为char*类型返回。 通过运算符重载,我们就可以实现string的[]访问。 然后我们实现和append。 …

[黑皮系列] 计算机网络:自顶向下方法(第8版)

文章目录 《计算机网络:自顶向下方法(第8版)》简介作者目录前言配套公开课 《计算机网络:自顶向下方法(第8版)》 出版信息: 原作名: Computer Networking: A Top-Down Approach 作者: [美] Jame…

我是没想到是还可以这样秒出答案 ...

起因 晚上在休闲游戏中,一网友发来信息求问,一道编程题。 咋一看,嘿 2023年1月浙江选考题(信息技术),挺新鲜,那就来看看吧。 聊了一下才知道,这是中考高考(6月28日晚23&…

neovim -- 使用clangd以及coc.nvim阅读代码

coc.nvim介绍 Coc.nvim 是一个基于NodeJS 的适用于Vim8, Neovim 的Vim 智能补全插件。拥有完整的LSP 支持。配置、使用方式及插件系统的整体风格类似 VSCode。 安装coc.nvim(VimPlug) Plug neoclide/coc.nvim添加插件 nvim界面 :CocInstall coc-jso…

Python with提前退出:坑与解决方案

Python with提前退出:坑与解决方案 问题的起源 早些时候使用with实现了一版全局进程锁,希望实现以下效果: Python with提前退出:坑与解决方案 全局进程锁本身不用多说,大部分都依靠外部的缓存来实现的,r…

c++:继承(超详解)

目录 一:什么是继承 二:继承的格式 继承的总结: 二:子类和父类(基类和派生类) 1.子类和父类的相互赋值: 2.同名的成员变量 3.同名成员函数 三:子类中默认的成员函数 1.构造…

C语言基础--#if与#endif

目录 一、C语言中的 #if()和 #end if 用法 1. #if 表达式 程序段 #endif 形式 2. #ifdef标示符 标识符 #endif 形式 3. #if 0/ #if 1 #endif 形式 4. \可用于一行的结尾,表示本行与下一行连接起来 二、xTaskCreate函数 三、指针相关…

一个具有电子杂志的模板平台,制作起来事半功倍!

平时大家都是怎么做电子杂志的呢?用什么软件来做呢?现在,越来越多的企业开始将传统的纸质杂志转变为电子杂志。电子杂志不仅可以节省印刷成本,还能为读者提供更加丰富的阅读体验。那么,如何快速制作电子杂志呢&#xf…

【Android Jetpack】Room数据库

文章目录 引入EntitiesPrimary Key主键索引和唯一性对象之间的关系外键获取关联的Entity对象嵌套对象Data Access Objects(DAOs)使用Query注解的方法简单的查询带参数查询返回列的子集可被观察的查询 数据库迁移用法 引入 原始的SQLite有以下两个缺点: …