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

Python网络爬虫的基本原理

什么是爬虫?

请求网站并提取数据的自动化程序。

爬虫基本流程

1:向服务器发起请求

通过HTTP库向目标站点发起请求,即发送一个Request请求可以包含额外的headers等信息,等待服务器的响应。

2:获取响应内容

如果服务器正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)。

3:解析内容  

得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转成Json对象进行解析,可能是二进制数据,可以保存或者进一步处理

4:保存内容  

保存形式多样,可以保存成文本、表格,也可以保存至数据库,或者保存成特定格式的文件。

所以爬虫的过程如下图

那什么是Response和Request呢 ?

 

  1. 浏览器就发送消息给该网址所在的服务器,这个过程叫做HTTP Request

  2. 服务器收到浏览器发送的消息后,能够根据浏览器发送的消息,做对应的处理,然后把消息返回(回传)给浏览器。此过程叫做HTTP Response

  3. 浏览器收到服务器的Response信息后,对这些信息做对应的处理,然后展示。

Request中包含哪些内容?

 1:请求方式主要是GET、POST两种类型,另外还有HEAD、PUT、DELETE、OPTIONS等。2:请求URLURL全称是统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL来唯一来确定3:请求头包含请求时的头部信息,如User-Agent、Host、Cookies等信息4:请求体请求时额外携带的数据,如表单提交时的表单数据

Response中包含哪些内容?

1:响应状态

常见响应状态码如下:

HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。当我们打开一个网页时,如果网页能够返回数据,也就是说影响成功了,一般状态响应码都是200。当然状态响应码,包括很多内容,下面列举了,状态响应码,及其表示的含义,其中加错的是在爬虫中经常遇到的:  100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。  101:转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。  102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。  200:请求成功 处理方式:获得响应的内容,进行处理  201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到  202:请求被接受,但处理尚未完成 处理方式:阻塞等待  204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。处理方式:丢弃  300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃  301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL  302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL  304:请求的资源未更新 处理方式:丢弃  400:非法请求 处理方式:丢弃  401:未授权 处理方式:丢弃  403:禁止 处理方式:丢弃  404:没有找到 处理方式:丢弃  500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。  501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。  502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。  503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

2:响应头

如内容类型、内容长度、服务器信息、设置cookies等等 3:响应体 最主要的部分,包含了请求资源的内容,如网页HTML、图片二进制数据等。

我们来举一个例子:

from fake_useragent import UserAgent
import requests
ua=UserAgent()
#请求的网址
url="http://www.baidu.com"
#请求头
headers={"User-Agent":ua.random}
#请求网址
response=requests.get(url=url,headers=headers)
#响应体内容
print(response.text)
#响应状态信息
print(response.status_code)
#响应头信息
print(response.headers)

网络的抓包

简单的网络爬虫首先是给定一个待爬取的URL队列,然后通过抓包的方式,获取数据的真实请求地址。接着采用httpclient模拟浏览器将相应的数据抓取下来(一般是html文件或者是json数据)。由于网页中的内容很多,很复杂,很多内容并不是我们需要的,所以我们需要对其进行解析。针对html的解析很简单,通过Jsoup(Dom解析工具)、正则表达式便可完成。针对Json数据的解析,这里我建议一款快速解析工具fastjson

阿里开源的比较好用,可以尝试一下。

我们能抓到怎样的数据?

1:网页文本 如HTML文档、JSON格式文本等 2:图片文件 获取的是二进制文件,保存为图片格式 3:视频 同为二进制文件,保存为视频格式即可 4:其他 只要能够请求到的,都能够获取到

解析方式

我们一共有六种解析方式

详情请看下图:

为什么我们抓到的有时候和浏览器看到的不一样?

有时候,网页返回是JS动态加载的,直接用请求库访问获取到的是JS代码,不是渲染后的结果。

 

怎样保存数据?

  我们可以把数据储存在数据库中也可以储存在本地,请看下图:

 


http://www.kler.cn/a/420519.html

相关文章:

  • Navicat连接SQL Server及SpringBoot连接SQL Server(jtds)
  • 【Golang】WaitGroup 实现原理
  • 柔性数组详解+代码展示
  • Redis开发05:使用stackexchange.redis库对redis进行增删改查
  • Proteus8.17下载安装教程
  • AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复
  • [docker中首次配置git环境]
  • Flink项目实战:实时数据流处理
  • Kimi悄悄开源了自家推理框架Mooncake~
  • 【Python TensorFlow】进阶指南(续篇五)
  • 《Vue零基础入门教程》第十六课:计算属性
  • 不开流也可以知道文件大小(File类)file.length():long
  • Android 中绘制带箭头的线
  • python代码实现问卷星问卷内容获取并写入word文档保存
  • 基于灰色神经网络的订单需求预测
  • el-table 纵向 横向 多级表头
  • Mysql实现定时自动清理日志(Windows环境)
  • 3. STM32_串口
  • 【无标题】在ensp中配置isis协议
  • 信创改造 - Redis -》TongRDS 安装方式之单节点模式安装
  • Scratch游戏推荐 | 星际前线:帝国逆袭——揭开帝国野心,挑战星际极限!
  • spider--某站搜索--自动化dp
  • ASP.NET Core MVC 入门
  • html+css+js网页设计 旅游 厦门旅游网14个页面
  • Java函数式编程【二】【Stream的装饰】【中间操作】【map映射器】【摊平映射器flatMap】
  • IPv6 如何实现网络安全?