线程的基础内容--python爬虫进阶

程序 Program,是一个指令的集合。 就是使用编程语言所编写指令集合,用于实现一定的功能 进程  启动后的程序称为进程,系统会有进程分配内存空间 一个进程中至少包含一个线程 线程 CPU的调度执行的基本单元 一个进程中包含N多个线程 进程结束,线程一定结束,线程结束,进程不一定结束 同一个进程中的多个线程,共享内存地址

初始线程的相关概念

继承方式实现多线程

为什么要使用类的方式创建线程 因为类可以更加方便的管理我们的代码,可以让我们使用面向对象的方式进行编程 实现多线程的方式 继承threading.Thread类 实现run()方法 调用线程Thread类的start()方法启动线程

进程的常用的相关的方法

多线程在我们处理相关的数据的时候,一定会更加的方便,使得我们的程序存在这多个相关的线程,所产生的相关的进程,但是这个多线程的调用会使得我们程序的本身存在着更多的分支,这样也难以更加的处理相关的线程

锁机制

threading.Lock类 为了解决多线程访问全局变量所造成的安全性问题可以采用锁机制。 访问全局变量无需加锁 修改全局变量时才需要加锁,修改完毕之后释放锁 加锁的操作步骤 创建锁对象   threading.Lock() 加锁      .acquire() 释放锁   .release()

因为我们的程序在多线程中是难以去处理和保证他的安全性的

所有我们可以去调用锁的机制

生产者与消费者模式

生产者与消费者模式是多线程开发中常见到的一种模式 生产者线程 生产者线程用于“生产”数据 消费者线程 消费者线程用于“消费”数据

这样的相关的模式会使得多线程的相关的优势更好的发挥出来

在一边我们对数据进行相关的存储,在另一个方向上我们对数据进行一系列的拿取

这样的话实现了我们程序的同步性,但是程序运行的本身也是异步的

线程间的通信

 

在这个地方呢,我们就把这个线程放进到这个队列的里面,这个队列中我们是不用去加锁的,因为这个队列Queue中原本就是一个相对安全的区域,我们的图片就在这个队列中进行存在,读取

就在这里,生产者一方面向这个队列中进行数据的相关的存放,这个消费者又一方面对数据进行一个相关的读取,这样就保证了程序的高效性

多线程的GIL锁

GIL锁 Python自带的解释器是CPython。CPython解释器的多线程实际上一个假的多线程(在多核CPU中,只能利用一核,不能利用多核)。同一时刻只有一个线程在执行,为了保正同一时刻只有一个线程在执行,在CPython解释器中有一个东西叫GIL(Global Intepreter Lock),叫全局解释器锁。 常见的Python解释器 1.Jython: 用Java实现的Python解释器。不存在GIl锁 2.IronPython:用.net实现的Python解释器。不存在GIL锁 3.PyPy:用Python实现的Python解释器。存在GIL锁 GIL虽然是一个假的多线程。但是在处理一些IO操作(比如文件读写和网络请求)还是可以在很多程序上提高效率的。有IO操作上建议使用多线程提高效率。

GIL锁 GIL可以保证全局同一时刻只有一个线程在执行,但是他不能保证执行代码的原子性。 Lock 多个线程访问全局变量时数据的安全性

 

什么是动态网页爬虫 

动态网页,是在网站不重新加载的情况下,通过ajax技术动态更新网站中的局部数据,比如王者荣耀的高清壁纸,在换页的过程中,url是没有发生改变的。但是壁纸动态的更改了。 AJAX(Asynchronouse JavaScript AndXML)异步JavaScrip和XML。前端与服务器进行少量数据交换,Ajax可以使用网页实现异更新。这意叶着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页,如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方向,使用的是XML语法。因此叫AJAX,其实现在数据交互基本上都是使用JSON。使用Ajax加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过Ajax加载的数据,只能看到使用这个url加载的html代码。 

这个地方就是告诉了我们如果去使用这个ajax请求的时候,即使我们的页面在调用的时候发生了相关的改变,我们使用这种的动态的的请求的时候,这个页面是会随着我们的修改进行相关的变化的,不需要我们手动的再去页面进行相关的修改

 

安装的相关的方式

 

selenium的行为链

为什么需要行为链? 因为有些网站可能会在浏览器端做一些验证行为是否符合人类的行为来做反爬虫。 有更多的复杂操作,在自动化测试中经常使用 行为链如何使用 导入from selenium.webdriver.common.action_chains import ActionChains 创建对象 actions=ActionChains(driver) 移动到某元素 actions.move_to_element(element) 文本框填入内容 actions.send_keys_to_element(element,'python') 单击  actions.click(element)

页面等待

隐式等待: 调用 driver.implicitly

_wait.那么在获取不可用的元素之前,会先等待N秒钟的时间 显示等待: 显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就会抛出一个异常,显示等待应用

字体反爬

字体反爬的原理 网页开发者自己创建一种字体,因为在字体中每个文字都有其代码,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使取到了网页中的文本内容,也只是获取到文字的代码,而不是文字本身 因为创建字体费时费力,并且如果把中国3000多常用汉字都实现,那么这个字体将达到几十兆,也会影响网页的加载,一般情况下为了反爬虫,仅会针对0-9以及少数汉字进行自己单独创建,其他的还是使用用户系统中自带的字体。

寻找字体 一般情况下为了考虑网页渲染性能,通常网站的开发者会把字体编码成base64的方式,因此我们可以到网页中找到@font_face属性,然后获取里面的base64代码,再用Python代码进行解码,然后再保存本地: 如果没有使用base64,还有另外一种方式,就是直接把字体文件放到服务器上,然后前端通过@font-face中的url函数进行加载。

寻找字体 如果没有使用base64,还有另外一种方式,就是直接把字体文件放到服务器上,然后前端通过@font-face中的url函数进行加载。   官方https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值