爬虫的基本原理

有时候我们需要从网络上获取想要的数据,比如豆瓣上好看的电影排行,或者某个地区的历史天气状况等。假如我们每次自己去上网查询,这是一项非常枯燥且费力的工作。我们就可以去写一个程序根据网页的节点连接自动去获取数据,这种自动化程序就是网络爬虫。

爬虫爬取网页的过程一般分为三个步骤:网页获取页面解析数据存储

网页获取:python 有很多网络请求的库,可以模拟我们向网络发出的请求,比如 urllibrequests 等。通过向网络发出请求,就可以获得服务器向我们返回的响应文件。

页面解析:得到了响应(网页的源代码)接下来就是对响应进行解析,取得其中对我们有用的数据。常用的页面解析工具有 正则表达式(Regular Expression) reBeautiful SoupPyquerylxml 等。

数据存储:获得了有用的信息后当然就是要将他们保存下来。可以直接保存为 TXT 文本或者 JSON 文本,也可以保存到 MySqlRedisMongoDB 等数据库中。

有时候我们在用 urllib 或者 requests 库获取网页时,得到的网页和在开发者工具中看到的网页源代码不一致。这是因为现在大多数的网页采用 Ajax 技术构建,整个网页是由 JavaScript 渲染出来的。HTML 只是页面的骨架,页面的呈现是通过 JavaScript 改变 HTML 节点向其中添加内容渲染出来的。这时候一种方法是通过分析 Ajax 接口获得所需网页,一种方法是使用 Selenium ,Splash 库模拟 JavaScript 渲染,也即所见即所得。

HTTP 的特点是无状态性,说的是 HTTP 协议对事务处理是没有记忆能力的。这时候就需要 会话(Session)Cookies 来保持 HTTP 的连接状态。会话在服务器端,Cookies 在客户端或者说浏览器。会话对象用来存储会话所需的属性和配置信息,从而保证用户在页面跳转时信息不会丢失。它的工作过程是这样的:当用户向服务器发出请求时,服务器便会为这次请求建立一个会话,接着服务器向用户返回的请求头中会添加 Set-Cookie 字段,里面含有用户的 ID 信息,客户端收到 Cookies 就把它保存在本地,当下次再向服务器发出请求时,就会在请求头中加上 Cookies 信息,Cookies 中携带了会话的 ID 信息,服务器根据这个 Cookies 找到其对应的会话,然后在会话中辨认用户的状态。如果 Cookies 是无效的或者会话已经过期,就不能继续访问页面而受到错误报告。

一个值得注意的地方就是,我们通常认为关闭了浏览器就关闭了会话,从而导致访问页面失败,这是错误的。产生这样的错觉是因为关闭了浏览器,Cookies 信息就会丢失,当再次访问服务器时,服务器就找不到对应的会话。正是因为关闭浏览器不会导致会话被删除,我们才需要为会话设置一个失效时间

当我们爬取网页的时候,经常会出现访问频率过高导致服务器封 IP 而拒绝服务,这时候就需要代理来解决 IP 失效的问题。所谓 代理(Proxy Server)指的是代理服务器。他的作用相当于中转站,当我们要向某个服务器发出请求时,就把这个请求发送给代理服务器,由代理服务器向目标服务器发送请求。服务器返回的响应也是先发送给代理服务器,再由代理服务器把响应转发给本机。

使用代理服务器的好处一般有:

      1. 提高访问速度:代理服务器会将服务器返回的响应先缓存起来,本机可以随时从缓冲区取出信息。

      2. 解决 IP 访问限制的问题:一些站点限制某些 IP 不能对其进行访问,我们就可以借助代理服务器对其访问。

      3. 隐藏真实 IP:由于向服务器发送请求的是代理服务器,服务器就不知道发送请求的真实源 IP,从而可以防止爬虫自身 IP 被锁。

那么从哪里可以获得代理呢?一般有以下几种途径:

      1. 使用网上的免费代理:这种代理一般不稳定,容易失效,因此需要我们自己筛选和维护。

      2. 购买付费代理: 向代理商购买获得稳定的代理服务。

      3. ADSL 拨号:ADSL 拨号的原理是每次拨号,ISP 就会根据用户和密码验证此次拨号的合法性,然后从 IP 池中为用户分配一个 IP,用户注销后又回收 IP。因此这种方式既稳定又非常的有效。





评论

  1. #1

    dUoxKpta 2019-09-06 01:15:04
    dUoxKpta

  2. #2

    WEmXeAbt 2019-09-05 22:19:22
    WEmXeAbt

  3. #3

    zuLdJdBo 2019-09-05 19:42:00
    zuLdJdBo