python爬虫结课了,最后的高性能爬虫方案
代理:避开IP这种反扒机制
什么是代理:
代理服务器
代理的作用:
突破自身IP访问限制
隐藏自身真实IP
代理IP的类型
http:应用到http协议对应的url中 proxies ={‘协议’:‘ip:端口号’}
https:应用到https协议对应的url中
代理IP的匿名度:
透明:服务器知道该请求使用了代理,也知道请求对应的真实IP
匿名:知道使用了代理,不知道真实IP
高匿:不知道使用了代理,更不知道真实的IP
高性能异步爬虫:
目的:在爬虫中使用异步实现高性能的数据爬取操作
异步爬虫的方式:
多线程/多进程:(不建议)
好处:可以为相关阻塞的操作单独开启线程或进程,阻塞操作就可以异步执行。
弊端:无法无限制的开启多线程或多进程。
线程池/进程池:(适当使用)
好处:我们可以降低系统对进程或线程的创建和销毁的一个频率,从而很好的降低系统的开销。
弊端:池中线程或进程的数量是有上限的。
导入线程池模块对应的类:from multiprocessing import pool
实例化一个线程池对象:pool = pool(n) n:线程池中线程数
线程池的使用:pool.map(阻塞操作,可迭代对象)
使用原则:线程池处理的是阻塞且较为耗时的操作
单线程+异步协程(推荐)
event_loop:事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行
coroutine:协程对象,我们可以将协程对象注册到循环事件中,它会被事件循环调用
我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即执行,而是返回一个协程对象
task:任务,它是对协程对象的进一步封装,包含了任务的各个状态
future:代表将来执行会还没执行的任务,实际上和 task 没有本质区别
async:定义一个协程
await: 用来挂起阻塞方法的执行
异步请求(aiohttp)
环境安装:
pip install aiohttp
使用该模块中的ClientSession
使用aiohttp
请求代替requests
请求
用法:
async with aiohttp.ClientSession() as session:
get()/post():
headers,params/data,proxy=‘http://ip:port’
async with await session.get(url) as response:
text() 返回字符串形式的响应数据
read() 返回二进制形式的响应数据
json() 返回的就是json对象
注意:获取相应数据操作之前一定要使用await进行手动挂起
page_text = await response.text()