爬虫基础

请求
        由客户端向服务端发出,可以分为4 部分内容:请求方法( Request Method ) 、请求的网址
( Request URL )、请求头( Request Headers ) 、请求体( Request Body )。

1 . 请求方法
常见的请求方法有两种: GET 和POST 。
在浏览器中直接输入URL 井回车,这便发起了一个GET 请求,请求的参数会直接包含到URL里。例如,在百度中搜索Python ,这就是一个GET 请求,链接为https://www. baidu.corn/s?wd= Python ,其中URL 中包含了请求的参数信息,这里参数wd 表示要搜寻的关键字。POST 请求大多在表单提交时发起。比如,对于一个登录表单,输入用户名和密码后,点击“ 登录”按钮,这通常会发起一个POST请求,其数据通常以表单的形式传输,而不会体现在URL 中。
GET 和POST 请求方法有如下区别。
        GET 请求中的参数包含在URL 里面,数据可以在URL 中看到,而POST 请求的URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中。
        GET 请求提交的数据最多只有1024 字节,而POST 方式没有限制。
一般来说,登录时,需要提交用户名和密码,其中包含了敏感信息,使用GET 方式请求的话,密码就会暴露在URL 里面,造成密码泄露,所以这里最好以POST 方式发送。上传文件时,由于文件内容比较大,也会选用POST 方式。

2 请求的网址
        请求的网址,即统一资惊定位符URL ,它可以唯一确定我们想请求的资源。

3 . 请求头
        请求头,用来说明服务器要使用的附加信息,比较重要的信息有Cookie 、Referer 、User-Agent 等。

    Accept :请求报头域,用于指定客户端可接受哪些类型的信息。
    Accept-Language :指定客户端可接受的语言类型。
    Accept-Encoding :指定客户端可接受的内容编码。
    Host :用于指定请求资源的主机IP 和端口号,其内容为请求URL 的原始服务器或网关的位置。从HTTP 1. l 版本开始,请求必须包含此内容。
    Cookie :也常用复数形式Cookies ,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,会发现都是登录状态,这就是Cookies 的功劳。Cookies 里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上Cookies 并将其发送给服务器,服务器通过Cookies 识别出是我们自己,并且查出当前状态是登录状态,所以返回结果就是登录之后才能看到的网页内容。
    Referer :此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等。
    User-Agent :简称UA ,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本、浏览器及版本等信息。在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别州为爬虫。
    Content-Type :也叫互联网媒体类型( Internet Media Type )或者MIME 类型,在HTTP 协议消息头中,它用来表示具体请求中的媒体类型信息。例如, text/html 代表HTML 格式,image/gif代表GIF 图片, application/json 代表JSON 类型,更多对应关系可以查看此对照表:http://tool.oschina.neνcommons 。
因此,请求头是请求的重要组成部分,在写爬虫时,大部分情况下都需要设定请求头。

4. 请求体
请求体-般承载的内容是POST 请求中的表单数据,而对于GET 请求,请求体则为空。

晌应
        响应,由服务端返回给客户端,可以分为三部分:响应状态码( Response Status Code )、响应头( Response Headers )和响应体( Response Body )。

 

JavaScript 渲染页面

有时候,我们在用时lib 或requ曰“抓取网页时,得到的游、代码实际和浏览器中看到的不一样。
这是一个非常常见的问题。现在网页越来越多地采用Ajax 、前端模块化工具来构建,整个网页可能都是由JavaScript 渲染出来的,也就是说原始的HTML 代码就是一个空壳, 例如:

< ! OOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>This is a Oemo</title>
</head>
<body>
    <div id= "container" ></div>
</body>
    <script src= "app.js" ></script>
</html>

body 节点里面只有一个id 为container 的节点,但是需要注意在body 节点后引入了app. ,它便负责整个网站的渲染。
在浏览器中打开这个页面时,首先会加载这个HTML 内容,接着浏览器会发现其中引人了一个app.js 文件,然后便会接着去请求这个文件,获取到该文件后,便会执行其中的JavaScript 代码,而JavaSc ript 则会改变HTML 巾的节点,向其添加内容,最后得到完整的页面。
但是在用时lib 或requests 等库请求当前页面时,我们得到的只是这个HTML 代码,它不会帮助我们去继续加载这个JavaScript 文件,这样也就看不到浏览器中的内容了。这也解释了为什么有时我们得到的源代码和浏览器中看到的不一样。
因此,使朋基本HTTP 请求库得到的源代码可能跟浏览器中的页面源代码不太一样。对于这样的情况,我们可以分析其后台Ajax 接口,也可使用Selenium 、Splash 这样的库来实现模拟JavaScript 渲染。

会话和Cookies

在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就向动登录了,而且很长时间都不会失效,这种情况又是为什么?其实这里面涉及会话(Session )和Cook ies 的相关知识。

HTTP 的无状态是指HTTP 协议对事务处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态。当我们向服务器发送请求后,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录。这意味着如果后续需要处理前面的信息,则必须重传,这导致需要额外传递一些前面的重复请求,才能获取后续响应,然而这种效果显然不是我们想要的。为了保持前后状态,我们肯定不能将前面的请求全部重传一次,这太浪费资源了,对于这种需要用户登录的页面来说,更是棘手。
这时两个用于保持HTTP 连接状态的技术就出现了,它们分别是会话和Cookies 。会话在服务端,也就是网站的服务器,用来保存用户的会话信息; Cookies 在客户端,也可以理解为浏览器端,有了Cookies ,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别Cookies 并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的响应。
我们可以理解为Cookies 里面保存了登录的凭证,有了它,只需要在下次请求携带Cookies 发送请求而不必重新输入用户名、密码等信息重新登录了。
因此在爬虫中,有时候处理需要登录才能访问的页面时,我们一般会直接将登录成功后获取的Cookies 放在请求头里面直接请求,而不必重新模拟登录。

会话

    在Web 中,会话对象用来存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web 页之间跳转时,存储在会话对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的Web 页时如果该用户还没有会话, 则Web 服务器将自动创建一个会话对象。当会话过期或被放弃后,服务器将终止该会话。

Cookies

    Cookies 指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据。

会话维持

那么,我们怎样利用Cookies 保持状态呢?当客户端第一次请求服务器时,服务器会返回一个请求头中带有Set-Cookie 字段的响应给客户端,用来标记是哪一个用户,客户端浏览器会把Coo kies 保•存起来。当浏览器下一次再请求该网站时,浏览器会把此Cookies 放到请求头一起提交给服务器, “Cookies 携带了会话ID 信息,服务器检查该Cookies 即可找到对应的会话是什么,然后再判断会话来以此来辨认用户状态。

在成功登录某个网站时,服务器会告诉客户端设置哪些Cookies 信息,在后续访问页面时客户端会把Cookies 发送给服务器,服务器再找到对应的会话加以判断。如果会话中的某些设置登录状态的变量是有效的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了。
反之,如果传给服务器的Cookies 是无效的,或者会话已经过期了,我们将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录。
所以, Cookies 和会话需要配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登录会话控制。

代理的基本原理

代理实际上指的就是代理服务器,英文叫作proxy server ,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站。在我们正常请求一个网站时, 是发送了请求给Web 服务器,Web 服务器把响应传回给我们。如果设置了代理服务器, 实际上就是在本机和服务器之间搭建了一个桥, 此时本机不是直接向Web 服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给Web 服务器,接着由代理服务器再把Web 服务器返回的响应转发给本机。这样我们同样可以正常访问网页,但这个过程中Web 服务器识别出的真实IP 就不再是我们本机的IP 了,就成功实现了IP 伪装,这就是代理的基本原理。

对于爬虫来说,由于爬虫爬取速度过快,在爬取过程中可能遇到同一个IP 访问过于频繁的问题,此时网站就会让我们输入验证码登录或者直接封锁E ,这样会给爬取带来极大的不便。
使用代理隐藏真实的IP ,让服务器误以为是代理服务器在请求向己。这样在爬取过程中通过不断更换代理,就不会被封锁,可以达到很好的爬取效果。

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值