爬虫基础|你不动我不动,响应?

大家好,我是杨小爽,我的文章是较为严肃的技术文,今天我们继续来深入了解一下HTTP中的响应内容,本文分为两部分,请慢慢品读。

随着近30年互联网的飞速发展,人们在网络上查找一个信息变得越来越简单,世界的距离不断缩短着,打开电脑的浏览器,或者借用手机上的浏览器,几个按键操作,各种信息就快速地展现在人们的眼前。

今天我们故事的两位主角便是浏览器和喜欢伪装浏览器的爬虫。

一、日常生活中的浏览器

1、浏览器的使用

打开电脑,双击桌面上的浏览器图标执行打开操作,一个浏览器窗口便出现在我们眼前,在网址输入框输入目标网址,几秒钟内你想查找的内容就出现在你的眼前了。

我们输入网址按Enter键后,浏览器后执行一系列操作向网站(服务器,下同)发起一个请求,服务器接收到请求后,先解析请求,并根据请求内容和一定规则向浏览器返回响应内容,浏览器拿到响应内容后,解析出内容并显示在浏览器用户浏览界面上。

这便是浏览器在背后在做的事情。

本文的重点在响应内容上,那么服务器返回的响应内容是什么样的呢?

通常,服务器会返回一个HTML(超文本标记语言)文档,浏览器解析了显示给用户;如果这个HTML文档还引用了其他内容,浏览器会再次向服务器发起相应请求,获取到这些文件后解析并进行使用,所以我们才能看到浏览器显示给我们的如此多姿多彩地内容。

览器与服务器的请求响应过程

2、HTML

HTML,Hyper Text Markup Langguage,超文本标记语言,是一门用于制作网页的语言,浏览器解析了它就可以显示出我们见到的内容。

在浏览器中,通过F12键打开开发者工具后,刷新页面,便可以看到类似下图的内容,红色箭头执行的Type的值为document便代表这个响应的内容是一个HTML文档。

F12打开开发者工具查看HTML文档

那么它是什么样子的呢?点击响应后会出现类似下面的代码:

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Hello,HTML!</head><body><div><p>Thisis my first HTML</body></html>

HTML样例

可以看到,开头的是<!DOCTYPE html>,它表示文档使用了哪种HTML规范,这里指html5标准网页声明。

紧接着是一对对标签,<html></html>、<head></head>和<body></body>等标签。<html></html>用于告诉浏览器自身是一个HTML文档;<head></head>是HTML文档的头部标签,用于描述文档的各种熟悉和消息;<body></body>是HTML文档的主体标签,通常其包含了HTML文档所以展示出来的内容。

HTML的语法短短几字介绍不完,也是编写爬虫程序绕不开的点,请求成功获取到响应后需要对其进行解析,熟悉HTML语法,才能写出更加高效的进行解析。

二、模拟浏览器

1、模拟浏览器是什么意思?

浏览器在发起请求时,请求中会携带一些参数,网站会根据这些参数判断你是不是一个正常的用户在用浏览器进行访问。爬虫通常用于大量地获取网站的信息,爬虫使用者往往并不希望自己的身份曝光,所以需要对自己的身份进行伪装,一般通过代理IP、模拟浏览器发送的参数等方式来伪装。

爬虫虽然可以模拟浏览器访问获取到响应内容,但是当前动态网页越来越成为主流,如果不借助一些其他工具或找到数据加载的接口,也没办法通过直接请求获取到目标数据。

2、动态网页

编写爬虫除了解析静态网页外,更多地是面对动态网页,目标数据并不直接在响应的HTML文档上,而是通过动态加载的方式呈现出来。

常见的动态加载有三种方式:Ajax技术、JS加载技术,websocket。

(1)Ajax

Ajax,即Asynchronous Javascript And XML,异步Javascript和XML,是一种创建动态网页的技术,可以实现网页不刷新的情况下从网站获取数据动态更新部分网页内容。

Ajax也是当前流行的动态交互技术。

新浪微博评论

评论加载使用了ajax

新浪微博的博文评论便是使用了ajax技术,如果直接请求是看不到这些评论的,需要找到ajax的请求接口,根据一定的规则进行请求才可以获取到评论内容。

F12打开开发者工具查看ajax加载

查看ajax加载内容

通过F12打开开发者工具可以查看Ajax背后的加载过程,可以看到当我们点击评论后浏览器会向网站发起一个请求,网站会响应对应的数据,然后浏览器在不刷新页面的情况下将数据解析并显示出来。

所以,选择好目标爬取网站后,可以通过F12打开浏览器开发者工具来查看浏览器与网站如何进行请求响应的,判断目标网页是动态加载的还是静态页面。

(2)JS加载

除了Ajax技术外,还存在部分网站使用了JS来传输数据,将响应的数据隐藏在JS文件中,或者通过一定的计算后显示出内容或一些图表。JS加载的方式与Ajax类似,实际上,Ajax本身便是基于Javascript的技术,因此可以采用同样的方式查看响应数据。

(3)Websocket

Websocket是一种在单个TCP连接上进行全双工通信的协议。浏览器一旦和网站建立连接后,便允许网站主打向浏览器推送数据,在某些要求实时数据更新的场景十分高效,如直播弹幕、股票价格更新等等。

Websocket是一种与HTTP完全不同的协议,当我们访问采用Websocket协议的网站时,浏览器会先向网站发起一个基于HTTP协议的请求,请求中会携带一个Upgrade字段,其值为websocket,网站接收到这个请求后同时会基于HTTP协议返回一个状态码为101、原因短语为Switching Protocols的响应,表示同意升级为Websocket协议,这也叫握手。完成握手后,浏览器和客户端便可以随意的相互交换数据。

下图为采用了Websocket协议进行数据更新的网站火币网:

火币网

火币网正在进行数据更新

三、结尾语

开始写这篇文章的时候颇为担心,觉得思路没有理清楚。但写下来才发现,写爬虫会不可避免与这些东西打交道,而这些东西又是入门级且十分简单的内容,真正复杂的反而是验证码、反编译、JS加密这些内容,因此便硬着头皮一路写下来,把心中的看法都再梳理一遍。

都说强迫自己不好,但是你不动一动,怎么知道结果呢。

最后,谢谢大家,希望你们喜欢,如有任何疑问或建议,可以关注我的公众号“探索数据之路”,在公众号后台发消息联系我。

我的公众号

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值