能把爬虫讲的这么透彻的,没有20年功夫还真不行0基础也能看懂
Posted 退休的龙叔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了能把爬虫讲的这么透彻的,没有20年功夫还真不行0基础也能看懂相关的知识,希望对你有一定的参考价值。
前言
可以说很多人学编程,不玩点爬虫确实少了很多意思,不管是业余、接私活还是职业爬虫,爬虫世界确实挺精彩的。
今天来给大家浅谈一下爬虫,目的是让准备学爬虫或者刚开始起步的小伙伴们,对爬虫有一个更深更全的认知。
哪怕你没学过爬虫,看完这篇文章你也能明白爬虫的原理!
文章目录
一、认识爬虫
1.什么是爬虫?
用一句话来给大家介绍大名鼎鼎的爬虫:请求网站并提取数据的自动化程序。
通俗易懂一点讲,爬虫能干什么?它能帮你从网站上自动下载大量的文字、图片、视频、音频等等的数据,不用你一个一个地手动去操作。
2.爬虫的分类
根据使用场景,爬虫可以分为三类:
①通用爬虫(大而全)
功能强大,采集面广泛,通常用于搜索引擎,比如百度浏览器就是一个很大的爬虫程序。
②聚焦爬虫(小而精)
功能相对单一,只针对特定网站的特定内容进行爬取,比如说去某个网站批量获取某些数据,这也是我们个人最常用的一种爬虫了。
③增量式爬虫(只采集更新后的内容)
这其实是聚焦爬虫的一个迭代爬虫,它只采集更新后的数据,对老数据是不采集,相当于一直存在并运行,只要有符合要求的数据更新了,就会自动爬取新的数据。
3.Robots协议
在爬虫中有一个叫Robots协议需要注意一下,又称为“网络爬虫排除标准”,它的作用就是网站告诉你哪些东西能爬,哪些不能爬。
这个Robots协议去哪看?一般情况下直接在网站首页网址后面加/robots.txt就能查看。
比如百度的Robots协议就在https://www.baidu.com/robots.txt ,可以看到里面有很多网址都规定了不能爬。
比如Disallow:/shifen/ 说明当前Disallow:/shifen以及Disallow:/shifen下面的子目录网页均不能爬。
其实这个Robots协议属于一个君子协议,对于爬虫者来说,基本上就是口头协议,你违反了它你有可能会被追究法律责任,但不违反它,爬虫将是爬不到什么数据,所以平时双方都是睁一只闭一眼,不要太嚣张就可以了。
二、爬虫的基本流程
1.爬虫的4步
爬虫是怎么干活的?爬虫程序大致上可以分为四步走:
①发起请求
通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应。
②获取响应内容
如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有html、Json字符串和二进制数据(如图片视频)等类型。
③解析内容
得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是Json,可以直接转为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理。
④保存数据
保存的数据样式很多,可以保存为文本,也可以保存至数据库,或者保存为特定格式的文件。
基本上这就是爬虫要遵循的四步了。
2.Request和Response
Request和Response是爬虫中最重要的一部分,Request和Response是什么关系?它们两的关系如下图:
简单理解一下:
当我们在电脑的浏览器上搜索某个东西的时候,比如前面的所说的在百度搜索“Python”,你点击百度一下,就已经向百度的服务器发送了一个Request请求,Request包含了很多的信息,比如身份信息、请求信息等等,服务器接收请求之后做判断,然后返回一个Response给我们的电脑,这其中也包含了很多信息,比如请求成功与否,比如我们请求的信息结果(文字、图片和视频等等)。
这样讲应该很好理解吧?接下来我们再好好去看一下Request和Response。
三、了解Request
Request包含了哪些东西?它主要包含了以下一些东西:
1.请求方式
请求方式可以理解为你跟网站打招呼的方式,你要从网站拿到数据,你就得用正确的方式去跟它打招呼,它才有可能理你。
就好比你要别人家借个东西,你得先敲门再说你好,你直接爬窗户进去这谁瞧见了都得给你撵出去。
主要的请求方式有GET和POST,另外还有HEAD/PUT/DELETE/OPTIONS等等其他方式,其中最常用的还是GET这种请求方式。
2.请求URL
什么是URL?URL全称统一资源定位符,比如一个网页文档、图片、视频等等都有唯一的URL,在爬虫中我们可以理解为网址或者链接。
3.请求头
什么是请求头?英文名Request Headers,通常是指请求时包含的头部信息,比如User-Agent、Host、Cookies等等。
这些东西它相当于你向网站发送请求时你的身份信息,这里面经常需要伪装一下自己,伪装成普通用户,避免你的目标网站识别出来你是爬虫程序,规避一些反扒问题,顺利拿到数据。
4.请求体
官方一点的说辞就是请求时额外携带的数据,如表单提交时的表单数据。
怎么理解?就比如说你去你岳父家提亲,你不能空着手过去提亲对吧?你得带点东西才像个提亲的样子,你岳父才会把女儿许配给你,这是大家通用的礼数,少不了的。
在爬虫当中怎么理解?比如说在某些页面你得先登录了或者你得告诉我你请求什么,比如说你在百度这个网页中搜索“Python”,那么这个“Python”这个关键字就是你要携带的请求体,看到了你的请求体,百度才知道你要干什么。
当然了,请求体通常是用在POST这种请求方式里面,在GET请求时我们通常是拼接在URL里面,这里先理解一下就可以了,后续具体爬虫可以去加深理解。
5.实操查看Request
既然Request的理论我们已经讲过了,那么我们就可以去实操看一下Request具体在哪个位置以及包含哪些东西。
以谷歌浏览器Chrome为例,我输入关键字“Python”可以搜索出一堆结果,我们来用网页自带的控制台窗口来分析一下我们发出的Request请求。
按住F12或者在网页空白处右键选择“检查”,然后可以看到控制台里面有很多选择,比如说上面那一栏有一个菜单栏,初级爬虫一般我们就比较常用到的是Elements(元素)和Network(网络),其他的东西暂时用不到,等你学到了高级一点的爬虫就会用到了,比如JS逆向的时候可能会用到Application这个窗口,后面用到了再了解。
Elements包含了所有的请求结果的每一个元素,比如每一个图片的源代码都是有的,尤其是当你点了左上角的小箭头之后,你移动到的每一个地方在Elements窗口下都会显示对于的源代码。
Network就是爬虫常用到的网络信息,其中就有我们的Request,我们来看一下,在Network窗口下,勾选Disable cache(禁用缓存),并把All点上。
刷新一下网页看看效果,可以看出我们发出了132个Request请求,这个不用好奇,虽然我们只是向百度发出了“Python”这么一个请求,但有些是网页附带的请求。
虽然里面有很多类型,什么图片格式的png啊jpeg等等,但是你可以滑动到最上面,在Type(类型)那一列中有document这种类型,就是网页文档的意思,点击进去就有我们的Request信息。
点击document进去之后,又有一栏新的菜单栏,在Headers那一栏下面,我们可以看到 Request URL,也就是我们前面说的请求URL,这个URL才是我们真正向网页请求的URL,然后还有请求方式,可以看出来是GET请求这种方式。
往下再滑动一下,还可以看到我们前面讲的请求头 Request Headers ,信息很多,但我们前面讲的User-Agent、Host、Cookies都是有的,这些都是我们给服务器的信息。
Request Headers里面内容虽然多,我们在写爬虫程序的时候也是要在这方面做伪装工作,但并不是所有的信息我们都要写,选择性地写一些重要的信息就可以了,比如User-Agent必带,Referer和Host是选择性地带,cookie在要登录的情况下会带,常用的也就4项要做伪装。
至于请求体这里我就暂时不做查看了,因为我们这里的请求方式是GET请求,在POST请求中才能查看到请求体,没关系,爬虫用到了你自然就会明白的。
四、了解Response
Response主要包括3块内容,我们来一一了解一下。
1.响应状态
我们发送请求之后,网站会返回给我们一个Response,这其中就包括了响应状态码对于的响应状态,大致可以分为以下几种:
①200范围,比如响应状态码200则表示成功。
②300范围,比如301表示跳转。
③400范围,比如404找不到网页。
④500范围,比如502找不到网页。
对于爬虫来说,两三百则是我们最希望看到的响应状态,有可能会拿到数据,四五百基本上就凉了,拿不到数据的。
比如我们刚在在前面的Request请求发送时,在document文件中,在Headers窗口下的General里面可以看出响应状态码是200,说明网页成功响应了我们的请求。
2.响应头
服务器给我们的信息里面也会有响应头这一部分,这里面包含了内容类型、内容长度、服务器信息和设置Cookie等等。
其实响应头对我们来说并不是那么重要,这里了解一下就可以了。
3.响应体
这个就很重要了,除了前面第一点的响应状态,就是它了,因为它包含了请求资源的内容,比如网页HTML和图片二进制数等等。
响应体在哪里呢?也是在document文件里面的Response那一栏,可以往下滑动就可以看出里面有很多响应的数据,这就是我们获取到的数据,有的是可以直接下载的,有的则是需要用技术去解析才能拿到。
五、爬虫能获取到什么样的数据?
爬虫能获取到什么样的数据?基本上可以分为这么几类:
①网页文档,如果HTML文档、Json格式文本等。
②图片,获取的是二进制文件,保存为图片格式即可。
③视频,也是二进制文件,保存为视频格式即可。
④其他的,反正其他能够看得见的东西,理论上都是可以用爬虫获取的,具体的话得看难度的大小。
六、如何解析数据?
从前面我们可以发送请求成功之后,网页会给我们返回很多的数据,有几千甚至几万条代码,那么如何在这么多的代码中找到我们想要的数据?常用的方法有以下几个:
①直接处理。当网页返回数据就是一些文本,就是我们想要的内容,不需要过滤处理,直接处理就可以。
②Json解析。如果网页返回的不是HTML数据是Json数据,那么就需要用到Json解析技术。
③正则表达式。如果返回的数据是符合正则表达式的数据,就可以用正则去做解析。
④其他解析方式。常用的有XPath、BeautifulSoup和PyQuery,这些都是爬虫常用的解析库。
七、怎么保存数据?
拿到数据后,常用的保存数据方法有以下几种:
①文本。可以直接保存为纯文本、EXCEL、Json、Xml等等类型的文本。
②关系型数据库。数据可以保存到关系型数据库,比如mysql和Oracle等等数据库。
③非关系型数据库。如MongoDB、Readis和Key-Value形式储存。
④二进制文件。如图片、视频、音频等等直接保存为特定格式即可。
关于爬虫,今天就先讲到这里,欢迎在下方评论区留言交流。
结语
爬虫是把双刃剑,用来“砍瓜切菜”还是“伤人性命”,全凭使用者一念之间,希望大家合理利用爬虫。
当然了,如果你技术很菜,你想做点出格的事都是不可能滴。
感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你,干货内容包括:
点击文末的名片可以抱走
java模块化热插拔,讲的太透彻了
Part 1消息队列
介绍消息队列技术的背景,包括使用场景和消息队列的功能特点,并设计了一个简单的消息队列。
- 1.1 系统间通信技术介绍
- 1.2 为何要用消息队列
- 1.3 消息队列的功能特点
- 1.4 设计一个简单的消息队列
Part 2消息协议
介绍消息队列中常用的消息协议,包括每个消息协议的历史背景、主要概念和基于该协议的消息通信过程。本章所介绍的协议也是接下来理解各种消息中间件产品的基础。
2.1 AMQP
2.2 MQTT
2.3 STOMP
2.4 XMPP
2.5 JMS
Part 3RabbitMQ
具体介绍RabbitMQ的特点、主要概念和Java使用示例,接着通过使用RabbitMQ实现异步处理和消息推送的功能,最后给出在工作中使用RabbitMQ时的一些实践建议。
3.1 简介
3.2 工程实例
- 3.2.1 Java访问RabbitMQ实例
- 3.2.2 Spring整合RabbitMQ
- 3.2.3 基于RabbitMQ的异步处理
- 3.2.4 基于RabbitMQ的消息推送
3.3 RabbitMQ实践建议
- 3.3.1 虚拟主机
- 3.3.2 消息保存
- 3.3.3 消息确认模式
- 3.3.4 消费者应答
- 3.3.5 流控机制
- 3.3.6 通道
- 3.3.7 总结
Part 4ActiveMQ
具体介绍ActiveMQ的特点、基本概念和Java使用示例,接着通过使用ActiveMQ实现消息推送分布式事务的功能,最后给出在工作中使用ActiveMQ时的一些实践建议。
4.1 简介
4.2 工程实例
- 4.2.1 Java访问ActiveMQ实例
- 4.2.2 Spring整合ActiveMQ
- 4.2.3 基于ActiveMQ的消息推送
- 4.2.4 基于ActiveMQ的分布式事务
4.3 ActiveMQ 实践建议
- 4.3.1 消息转发模式
- 4.3.2 消息积压
- 4.3.3 消息事务
- 4.3.4 消息应答模式
- 4.3.5 消息发送优化
- 4.3.6 消息消费优化
- 4.3.7 消息协议
- 4.3.8 消息持久化
Part 5Kafka
具体介绍Kafka的特点、主要概念和Java使用示例,接着通过使用Kafka实现用户行为数据采集、日志收集和流量削峰的功能,最后给出在工作中使用Kafka时的一-些实践建议。
5.1 简介
5.2 工程实例
- 5.2.1 Java访问Kafka实例
- 5.2.2 Spring整合Kafka
- 5.2.3 基于Kafka的用户行为数据采集
- 5.2.4 基于Kafka的日志收集
- 5.2.5 基于Kafka的流量削峰
5.3 Kafka实践建议
- 5.3.1 分区
- 5.3.2 复制
- 5.3.3 消息发送
- 5.3.4 消费者组
- 5.3.5 消费偏移量
Part 6RocketMQ
具体介绍RocketMQ的特点、主要概念和Java使用示例,接着通过使用RocketMQ的特性实现消息顺序处理和分布式事务的另外一种解决方案,最后给出在工作中使用RocketMQ时的一些实践建议。
6.1 简介
6.2 工程实例
- 6.2.1 Java访问RocketMQ实例
- 6.2.2 Spring整合RocketMQ
- 6.2.3 基于RocketMQ的消息顺序处理
- 6.2.4 基于RocketMQ的分布式事务
6.3 RocketMQ实践建议
- 6.3.1 消息重试
- 6.3.2 消息重复
- 6.3.3 集群
- 6.3.4 顺序消息
- 6.3.5 定时消息
- 6.3.6 批量发送消息
- 6.3.7 事务消息
最后
给读者们一个小福利,有需要这些资料的朋友们可以点击我,即可免费领取资料!
ActiveMQ消息中间件面试专题
- 什么是ActiveMQ?
- ActiveMQ服务器宕机怎么办?
- 丢消息怎么办?
- 持久化消息非常慢怎么办?
- 消息的不均匀消费怎么办?
- 死信队列怎么办?
- ActiveMQ中的消息重发时间间隔和重发次数吗?
ActiveMQ消息中间件面试专题解析拓展:
redis面试专题及答案
- 支持一致性哈希的客户端有哪些?
- Redis与其他key-value存储有什么不同?
- Redis的内存占用情况怎么样?
- 都有哪些办法可以降低Redis的内存使用情况呢?
- 查看Redis使用情况及状态信息用什么命令?
- Redis的内存用完了会发生什么?
- Redis是单线程的,如何提高多核CPU的利用率?
Spring面试专题及答案
- 谈谈你对 Spring 的理解
- Spring 有哪些优点?
- Spring 中的设计模式
- 怎样开启注解装配以及常用注解
- 简单介绍下 Spring bean 的生命周期
Spring面试答案解析拓展
高并发多线程面试专题
- 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
- Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
- Java 中 wait 和 sleep 方法有什么区别?
- 如何在 Java 中实现一个阻塞队列?
- 如何在 Java 中编写代码解决生产者消费者问题?
- 写一段死锁代码。你在 Java 中如何解决死锁?
高并发多线程面试解析与拓展
jvm面试专题与解析
- JVM 由哪些部分组成?
- JVM 内存划分?
- Java 的内存模型?
- 引用的分类?
- GC什么时候开始?
JVM面试专题解析与拓展!
发多线程面试解析与拓展**
[外链图片转存中…(img-kuzpc5va-1624524653811)]
jvm面试专题与解析
- JVM 由哪些部分组成?
- JVM 内存划分?
- Java 的内存模型?
- 引用的分类?
- GC什么时候开始?
JVM面试专题解析与拓展!
[外链图片转存中…(img-wCF4SZKn-1624524653811)]
以上是关于能把爬虫讲的这么透彻的,没有20年功夫还真不行0基础也能看懂的主要内容,如果未能解决你的问题,请参考以下文章