第一章 爬虫基础之爬虫基本原理 ②

1.3 爬虫基本原理

  • 爬虫就是获取网页并提取和保存信息的自动化程序
    步骤:
    1.获取网页(的源代码):构造一个请求并发送给服务器,收到响应并解析。
    2.提取信息:使用正则表达式,xpath,bs4等作为提取规则
    3.保存数据:可以将提取的数据保存到TXT文件,json文件,也可以保存到数据库中,如mysql,mongoDB等等
    4.自动化程序:爬虫可以自动完成上诉操作,包括异常处理,错误重试等。

1.4 Session 和Cookie

  • 静态网页:由HTML编写的,所有的文字、图片均通过写好的HTML代码指定,有加载速度快,编写简单,但可维护性差,不灵活的特点。
  • 动态网页:可以动态解析URL中参数的变化,关联数据库并动态呈现不同页面内容。可以实现用户登录注册。

无状态HTTP:
HTTP协议对事务处理是没有记忆能力的,服务器并不知道客户端出于什么状态。客户端向服务器发送请求后,服务器解析请求,返回响应。每一个请求都是独立的,服务器不会记录前后状态的变化。
那么就有了session和Cookie,其中session在服务器端,cookie在客户端(浏览器端)。浏览器有了cookie之后,下次访问相同页面会自动带上cookie发送给服务器。服务器识别cookie知道是哪个用户在访问,然后判断是否处于登录状态,并返回相对应的响应。

  • Session
    session对象用来储存特定用户session所需的属性和配置信息。当用户在应用程序的页面之间跳转时,储存的session对象的变量不会丢失。如果用户在请求网页时没有session,那么服务器会自动创建一个session对象。
  • Cookie
    客户端第一次请求服务器时,服务器会返回一个响应头中带有Set-Cookie字段的响应给客户端,用来标记用户。客户端会把他保存起来,在下一次请求相同网站的时候会带上放到请求头给服务器发过去。其中Cookie中有sessionID的信息,服务器通过检查Cookie就可以找到对应的session,然后会看session的状态,如果是有效的说明用户是登录状态,如果session失效则要重新登录。
    Cookie和session相互配合,一个在客户端,一个在服务器端,实现登录控制

常见误区:
关闭浏览器session就消失了,其实不是的。因为服务器并不知道客户端的浏览器什么时候关闭,一旦浏览器关闭Cookie就没了,而服务器端的session还是存在的,但是没有cookie就没有办法去找到对应的session了,所以我们需要给session设置一个有效时长,在长时间没有访问的情况下自动销毁。


1.5 代理的基本知识

代理指的是代理ip,是代理服务器的ip,在爬虫的时候,由于速度较快和机械化,比较容易被网站服务器识别出来,如果是用自己的ip去爬取数据,那么会暴露自己真实的ip,网站服务器会直接把真实IP封掉。所以我们可以使用代理IP。
原理是我们将请求发送给代理服务器,再由代理服务器去向网站服务器发送请求,网站服务器将数据响应发回给代理服务器,代理服务器再将获取的数据传回我们客户端。这样即使被识别出来了,封的也只是代理IP,我们可以切换多个不同的IP,从而达到不断爬取数据而不会被封的目的。


1.6 多线程和多进程的基本原理

  • 进程:一个可以独立运行的程序单位(比如浏览器进程,文本编辑器进程),是线程的集合。
  • 线程:操作系统进行运算调度的最小单位,进程中的最小运行单元。(浏览器进程中的播放音乐线程,播放视频线程)
  • 多线程:一个进程中同时执行多个线程(比如浏览器进程中同时播放音乐和播放视频),是实现并发的一个手段
  • 多进程:实现并行的有效方式,将多个任务分配到不同的cpu上同时执行,适合计算密集型任务。
  • 并发:多个线程对应的多条指令被快速轮换地执行,同一时刻只有一个线程在执行
  • 并行:同一时刻多条指令在多个处理器上同时执行。(并行必须依赖多个处理器(多核))

多线程适用场景:
首先分类一下:
IO密集型任务:一些比较耗时或需要等待的操作,比如等待查询数据库的返回,爬虫请求服务器后等待响应等。
计算密集型任务(CPU密集型任务):任务运行一直需要处理器参与,一直忙于计算的。
以上两种中IO密集型任务比较适合使用多线程,因为如果是单线程,在等待期间处理器是空闲状态,必须等该任务处理完毕后才能继续执行其他操作,效率低下,使用多线程可以在等待期间处理器去执行其他任务,提高效率。
而计算密集型的任务不宜使用多线程,因为不管哪一个任务都是需要一直使用到处理器的,如果频繁的在线程之间切换会影响计算速度,使得效率更加低下,因此更适合使用多进程的方式处理。
注意:多线程可以用并发实现,也可以用并行实现,但是每个进程都有自己的进程内存空间,是天然隔离的,而多线程用的是同一个内存空间,线程之间的同步是需要考虑的。

你可能感兴趣的:(第一章 爬虫基础之爬虫基本原理 ②)