Python爬虫(三)

一、Ajax的原理和解析

用requests抓取页面时,得到的结果可能会和在浏览器中看到的不一样,在浏览器中正常显示的页面数据,使用requests却没有得到结果,因为requests获取的都是原始HTML文档,而浏览器中的页面则是经过JavaScript数据处理后生成的结果

网页的原始HTML文档不会包含任何数据,数据都是通过Ajax统一加载后再呈现出来的,这样在Web开发上可以做到前后端分离,并且降低服务器直接渲染页面带来的压力

Ajax(Asynchronous JavaScript and XML)即异步的JavaScript和XML。
是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术,有了Ajax便可以在页面不被全部刷新的情况下更新其内容

1.基本原理

发送Ajax请求到网页更新的过程可以简单分为三步:

发送请求
解析内容
渲染网页

2.Ajax分析

在浏览器中右键打开“检查”选项,弹出开发者工具
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、Selenium的基本使用

Ajax请求的接口通常会包含加密的参数,如token、sign等
在这里插入图片描述
解决方法

方法一:找到token构造逻辑,用python复现,构造Ajax请求
方法二:模拟浏览器,绕过这个过程

Selenium是一个自动化测试工具,可以驱动浏览器执行特定的动作,如点击下拉等,同时可以获取浏览器当前呈现的页面源代码,做到可见即可爬,对使用JavaScript动态渲染的页面非常有效。

1.获取节点信息

获取属性:使用get_attribute方法来获取节点的属性,但是前提得选中这个节点
Selenium打开页面后,默认是在父级Frame里操作,而此时如果页面中还有子Frame,Selenium是不能获取到子Frame中节点的,需要使用swith_to.frame方法来切换Frame

2.前进后退

Selenium使用back方法后退,使用forward方法前进
使用try except语句来捕获各种异常

反屏蔽检测基本原理
检测当前浏览器窗口下的window.navigator对象
是否包含webdriver这个属性
因为在正常使用浏览器的情况下
这个属性是undefined然而一但使用了Selenium
Selenium会给window.navigator设置webdriver属性
很多网站就通过JavaScript判断
如果webdriver属性存在,那就直接屏蔽

使用JavaScript直接把webdriver属性置空,是在页面加载完成后才执行的,网站早在最初渲染页面之前就已经对webdriver属性进行了检测,所以上述方法不能达到效果

使用CDP来解决
通过CDP可以实现在每个界面刚加载的时候执行JavaScript代码
执行CDP方法叫做Page.addScriptToEvaluateOnNewDocument然后传入上文的JavaScript代码即可
这样就可以在页面加载之前将webdriver属性置空

三、异步爬虫的原理和解析

1.阻塞

阻塞指:程序未得到所需计算资源时被挂起的状态
常见的阻塞形式有:

网络 I/O 阻塞
磁盘 I/O 阻塞
用户输入阻塞等

2.同步/异步

同步:不同程序单元为了完成某个任务,在执行过程中需要靠某种通信方式协调一致,称这些程序单元是同步执行的
异步:为了完成某个任务,不同程序单元之间进程中无需通信协调,也能完成任务的方式,不相关的程序单元之间也是可以异步的。异步意味着无序

aiohttp是一个支持异步请求的库,利用它和asyncio配合可以非常方便地实现异步请求操作

多进程:利用CPU的多核优势,在同一时间并行地执行多个任务,可以大大提高执行效率
协程:又称微线程、纤程,协程是一种用户态的轻量级线程,拥有自己的寄存器上下文和栈,本质上是个单进程。相对于多进程,无需线程上下文切换的开销,无需原子操作锁定及同步的开销、

3.协程用法

event_loop:事件循环,相当于一个无限循环,可以把一些函数注册到这个事件循环上,当满足条件发生时,就调用对应的处理方法
coroutine:在Python中常指代为协程对象类型,可以将协程对象注册到时间循环中,会被事件循环调用,可以用async关键字来定义一个方法,在调用时不会立即执行,而是返回一个协程对象
task:任务,是对协程对象的进一步封装, 包含了任务的各个状态
future:代表将来执行或没有执行的任务的结果,实际上和task没有本质区别

耗时等待的操作一般都是IO操作的,如文件读取、网络请求
协程对于处理这种操作有很大优势
当遇到需要等待的情况时,程序可以暂时挂起,转而去执行其他操作
从而避免一直等待一个程序而耗费过多时间,充分利用资源

使用await可以将耗时等待的操作挂起,让出控制权
在这里插入图片描述

四、Pyppeteer的使用

Pyppeteer是Puppeteer的Python版本的实现
安装方式

pip install pyppeteer

其几乎所有功能都能在官方文档的API Reference里面找到
链接为:https://miyakogi.github.io/pyppeteer/reference.html

详细用法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、使用代理处理反爬的方法

代理实际上指的就是代理服务器
功能是代理网络用户去获取网络信息
是网络信息的中转站

代理的作用

· 突破自身IP访问限制,访问一些平时不能访问的站点
· 访问一些单位或团体内部资源,如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类FTP下载上传,以及各类资料查询共享等服务
· 提高访问速度,通常代理服务器都设置一个较大的硬盘缓冲区,当有外接信息通过时,也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度
· 隐藏真实IP,上网者也可以通过这种方法隐藏自己的IP,免受攻击。对于爬虫来说,用代理就是隐藏自身IP,防止被封锁

由于爬虫爬取速度过快,爬取过程中可能遇到同一个IP访问过于频繁的问题。此时网站就会让我们输入验证码登录或者直接封锁IP,这样会给爬取带来极大的不便。使用代理隐藏真实的IP,可以达到很好的爬取效果

1.代理分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代理池

代理池的基本模块分为4块:存储模块、获取模块、检测模块、接口模块
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗪磕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值