爬虫基本原理
爬虫概述
获取网页并提取和保存信息的自动化程序
1、获取网页
urllib、requests等库
向网站的服务器发送一个请求,服务器返回网页源码
2、提取信息
分析源代码,从中提取我们需要的数据
通用方法:正则表达式
根据网页结构提取信息:Beautiful Soup、pyquery、lxml等
3、保存数据
保存为TXT文本、JSON文本、数据库或者远程服务器
注意事项
-
JavaScript渲染的页面
urllib与requests只能得到HTML代码,而有时整个网页是由JavaScript渲染,所以抓取的网页与看到的网页不同
解决方法
分析源代码后台Ajax接口,也可以使用Selenium、Splash、Pyppeteer、Playwright库来模拟JavaScript渲染
静态网页与动态网页
静态网页:由HTML代码编写,不能与用户进行人机交互
动态网页:由HTML,JSP,PHP,Python等语言编写,可以动态解析URL中的参数的变化,关联数据库并动态呈现不同的页面内容
-
登录与注册
动态网页经典应用场景:用户登录与注册
HTTP的特点:无状态,对事务处理没有记忆能力
这一特点也使得要登陆才能看到的网页这一限制变得麻烦,需要不断重新传递请求
为了解决这一问题,出现了Session与Cookie
-
Session与Cookie
Session:在服务器端储存特定用户Session所需的属性及配置信息,当用户再次请求时,能通过这一Session进行访问,从而达到身份验证的目的
Cookie:在客户端储存的验证信息,为了鉴别用户身份、进行Session跟踪
代理
当爬虫访问频率过高时会被服务器封IP,此时可以将本机的IP伪装一下,让服务器识别不出请求是由我们本机发起的
代理服务器:Proxy Server,网络信息的中转站
多线程与多进程
进程:可以独立运行的程序单位,是线程的集合
线程:一个进程可以同时处理很多任务,例如浏览器可以同时打开很多窗口,其中播放音乐是一个线程,播放视频也是一个线程。线程是操作系统进行运算调度的最小单位,是进程的最小运行单位。
多进程:同时运行多个进程
多线程:同上
-
并发与并行
并发:多个线程对应的多条指令被快速轮换地执行(三心二意,一个处理器一会处理这个线程,一会处理另外一个线程)
并行:同一时刻有多条指令在多个处理器上同时执行(一心一意,一个处理器一直处理一个线程,需要多个处理器)
-
加快爬虫速度的方法
爬虫在向服务器发送请求后,必须等待服务器返回响应,属于IO密集型任务,可以启用多线程,在等待服务器返回请求时去处理其它线程,提高整体爬取效率
-
Python中的多线程与多进程
Python中GIL限制导致同一时刻只能运行一个线程,使得Python多线程无法发挥多核并行的优势,但是可以并发(可以用于爬虫)
GIL
GIL:Global Interpreter Lock,全局解释器锁,出于对数据安全的考虑
GIL可以看作是通行证,并且在一个Python进程中,GIL只有一个。线程没有通行证,就不允许执行
线程的执行方式:
- 获取GIL
- 执行对应线程的代码
- 释放GIL