python函数调度框架 python进程调度算法

Python的爬虫框架有哪些?向大家推荐十个Python爬虫框架 。
1、Scrapy:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架 。可以应用在包括数据挖掘 , 信息处理或存储历史数据等一系列的程序中 。它是很强大的爬虫框架,可以满足简单的页面爬?。?比如可以明确获知url pattern的情况 。用这个框架可以轻松爬下来如亚马逊商品信息之类的数据 。但是对于稍微复杂一点的页面,如weibo的页面信息,这个框架就满足不了需求了 。它的特性有:HTML, XML源数据 选择及提取 的内置支持;提供了一系列在spider之间共享的可复用的过滤器(即 Item Loaders),对智能处理爬取数据提供了内置支持 。
2、Crawley:高速爬取对应网站的内容,支持关系和非关系数据库 , 数据可以导出为JSON、XML等 。
3、Portia:是一个开源可视化爬虫工具,可让使用者在不需要任何编程知识的情况下爬取网站!简单地注释自己感兴趣的页面,Portia将创建一个蜘蛛来从类似的页面提取数据 。简单来讲,它是基于scrapy内核;可视化爬取内容,不需要任何开发专业知识;动态匹配相同模板的内容 。
4、newspaper:可以用来提取新闻、文章和内容分析 。使用多线程,支持10多种语言等 。作者从requests库的简洁与强大得到灵感,使用Python开发的可用于提取文章内容的程序 。支持10多种语言并且所有的都是unicode编码 。
5、Python-goose:Java写的文章提取工具 。Python-goose框架可提取的信息包括:文章主体内容、文章主要图片、文章中嵌入的任何Youtube/Vimeo视频、元描述、元标签 。
6、Beautiful Soup:名气大,整合了一些常用爬虫需求 。它是一个可以从HTML或XML文件中提取数据的Python库 。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间 。Beautiful Soup的缺点是不能加载JS 。
7、mechanize:它的优点是可以加载JS 。当然它也有缺点,比如文档严重缺失 。不过通过官方的example以及人肉尝试的方法,还是勉强能用的 。
8、selenium:这是一个调用浏览器的driver,通过这个库你可以直接调用浏览器完成某些操作,比如输入验证码 。Selenium是自动化测试工具,它支持各种浏览器,包括 Chrome,Safari,Firefox等主流界面式浏览器,如果在这些浏览器里面安装一个 Selenium 的插件,可以方便地实现Web界面的测试. Selenium支持浏览器驱动 。Selenium支持多种语言开发,比如 Java,C,Ruby等等,PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与Python的对接,Python进行后期的处理 。
9、cola:是一个分布式的爬虫框架,对于用户来说,只需编写几个特定的函数,而无需关注分布式运行的细节 。任务会自动分配到多台机器上,整个过程对用户是透明的 。项目整体设计有点糟,模块间耦合度较高 。
10、PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI 。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器 。Python脚本控制,可以用任何你喜欢的html解析包 。
以上就是分享的Python爬虫一般用的十大主流框架 。这些框架的优缺点都不同,大家在使用的时候,可以根据具体场景选择合适的框架 。
python的爬虫框架有哪些?1.Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架 。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中
2.pyspider 是一个用python实现的功能强大的网络爬虫系统,能在浏览器界面上进行脚本的编写,功能的调度和爬取结果的实时查看,后端使用常用的数据库进行爬取结果的存储,还能定时设置任务与任务优先级等 。
3.Crawley可以高速爬取对应网站的内容,支持关系和非关系数据库 , 数据可以导出为JSON、XML等
4.Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间 。
还有很多 , 比如Newspaper,Grab,Cola等等
爬虫框架学习可以看一下黑马程序员视频库的学习视频 , 免费学习哦!很高兴能为你提供帮助
[Django] celery的替代品 funboostDjango开发web应用的过程中python函数调度框架,一个老大难问题是异步调度问题 。例如用户传来一个非常耗时的请求python函数调度框架,这时候最好的处理方式是先把这个操作请求记录下来,先响应请求,等后面有空的时候再去计算,而不是让用户干等着着急 。
这种优化方式就是典型的生产者 消息队列 消费者设计模式,而Django框架本身并没有直接提供该设计模式的实现,大多教程都是利用第三方组件celery redis来实现这个调度 。
遗憾的是celery和redis官方都不支持windows,而我习惯的开发环境还是win10,所以需要找一个替代品 。经过调研,发现python函数调度框架了一个很好的【python分布式函数调度框架——funboost】. 它的优点很多,对Django开发来说,最大的亮点是完全无需启动第三方服务,即可实现生产消费设计模式 。一个pip install funboost即可干活 , 开箱即用 。它可以使用SQLite文件来做消息队列,足以应对小型应用开发 。当然也可以使用Kafka这种高级的消息中间件,实现高可用 。
要说缺点吧,这个组件的日志打印太啰嗦,而且没有提供关闭选项,控制台已被它刷屏 。
纯 Python 写一个 Web 框架,就是这么简单造轮子是最好的一种学习方式,本文尝试从0开始造个Python Web框架的轮子 , 我称它为ToyWebF。
本文操作环境为:MacOS , 文中涉及的命令,请根据自己的系统进行替换 。
ToyWebF的简单特性:
下面我们来实现这些特性 。
首先,我们需要安装gunicorn,回忆一下Flask框架,该框架有内置的Web服务器,但不稳定,所以上线时通常会替换成uWSGI或gunicorn,这里不搞这个内置Web服务,直接使用gunicorn 。
我们创建新的目录与Python虚拟环境,在该虚拟环境中安装gunicorn
在啥都没有的情况下,构建最简单的Web服务,在ToyWebF目录下,创建app.py与api.py文件 , 写入下面代码 。
运行gunicorn app:app访问,可以看见Hello, World! , 但现在请求体中的参数在environ变量中,难以解析,我们返回的response也是bytes形式 。
我们可以使用webob库,将environ中的数据转为Request对象,将需要返回的数据转为Response对象,处理起来更加直观方便,直接通过pip安装一下 。
然后修改一下API类的__call__方法,代码如下 。
上述代码中,通过webob库的Request类将environ对象(请求的环境信息)转为容易处理的request,随后调用handle_request方法对request进行处理,处理的结果,通过response对象返回 。
handle_request方法在ToyWebF中非常重要,它会匹配出某个路由对应的处理方法,然后调用该方法处理请求并将处理的结果返回,在解析handle_request前,需要先讨论路由注册实现,代码如下 。
其实就是将路由和方法存到self.routes字典中,可以通过route装饰器的形式将路由和方法关联,也可以通过add_route方法关联,在app.py中使用一下 。
因为url中可以存在变量 , 如@app.route("/hello/{name}") , 所以在匹配时 , 需要进行解析 , 可以使用正则匹配的方式进行匹配 , parse这个第三方库已经帮我们实现了相应的正则匹配逻辑,pip安装使用一下则可 。
这里定义find_handler方法来实现对self.routes的遍历 。
了解了路由与方法关联的原理后,就可以实现handle_request方法,该方法主要的路径就是根据路由调度对应的方法,代码如下 。
在该方法中,首先实例化webob库的Response对象,然后通过self.find_handler方法获取此次请求路由对应的方法和对应的参数,比如 。
它将返回hello方法对象和name参数,如果是/hello/二两,那么name就是二两 。
因为route装饰器可能装饰器的类对象,比如 。
此时self.find_handler方法返回的hanler就是个类,但我们希望调用的是类中的get、post、delete等方法 , 所以需要一个简单的判断逻辑 , 通过inspect.isclass方法判断handler如果是类对象,那么就通过getattr方法获取类对象实例的中对应的请求方法 。
如果类对象中没有该方法属性,则抛出该请求类型不被允许的错误,如果不是类对象或类对象中存在该方法属性,则直接调用则可 。
此外,如果方法的路由并没有注册到self.routes中,即404的情况,定义了defalut_response方法返回其中内容,代码如下 。
如果handle_request方法中调度的过程出现问题,则直接raise将错误抛出 。
至此,一个最简单的web服务就编写完成了 。
回顾Flask,Flask可以支持HTML、CSS、JavaScript等静态文件 , 利用模板语言,可以构建出简单但美观的Web应用 , 我们让TopWebF也支持这一功能,最终实现图中的网站 , 完美兼容静态文件 。
Flask使用了jinja2作为其html模板引擎,ToyWebF同样使用jinja2,jinja2其实实现一种简单的DSL(领域内语言),让我们可以在HTML中通过特殊的语法改变HTML的结构,该项目非常值得研究学习 。
首先pip install jinja2,然后就可以使用它了,在ToyWebF项目目录中创建templates目录,以该目录作为默认的HTML文件根目录,代码如下 。
首先利用jinja2的FileSystemLoader类将file system中的某个文件夹作为loader,然后初始化Environment 。
在使用的过程中(即调用template方法),通过get_template方法获得具体的某个模板并通过render方法将对应的内容传递给模板中的变量 。
这里我们不写前端代码 , 直接去互联网中下载模板,这里下载了Bootstrap提供的免费模板,可以自行去下载,下载完后,你会获得index.html以及对应的css、jss、img等文件,将index.html移动到ToyWebF/templates中并简单修改了一下,添加一些变量 。
然后在app.py文件中为index.html定义路由以及需要的参数 。
至此html文件的支持就完成了,但此时的html无法正常载入css和js , 导致页面布局非常丑陋且交互无法使用 。
接着就让ToyWebF支持css、js,首先在ToyWebF目录下创建static文件夹用于存放css、js或img等静态文件,随后直接将前面下载的模板,其中的静态文件复制到static中则可 。
通过whitenoise第三方库,可以通过简单的几行代码让web框架支持css和js,不需要依赖nginx等服务,首先pip install whitenoise,随后修改API类的__init__方法,代码如下 。
其实就是通过WhiteNoise将self.wsgi_app方法包裹起来 , 在调用API的__call__方法时,直接调用self.whitenoise 。
此时,如果请求web服务获取css、js等静态资源,WhiteNoise会获取其内容并返回给client,它在背后会匹配静态资源在系统中对应的文件并将其读取返回 。
至此,一开始的网页效果就实现好了 。
web服务如果出现500时,默认会返回internal server error,这显得比较丑,为了让框架使用者可以自定义500时返回的错误 , 需要添加一些代码 。
首先API初始化时,初始self.exception_handler对象并定义对应的方法添加自定义的错误
在handler_request方法进行请求调度时,调度的方法执行逻辑时报500,此时不再默认将错误抛出 , 而是先判断是否有自定义错误处理 。
在app.py中,自定义错误返回方法,如下 。
custom_exception_handler方法只返回自定义的一段话,你完全可以替换成美观的template 。
我们可以实验性定义一个路由来看效果 。
Web服务的中间件也可以理解成钩子,即在请求前可以对请求做一些处理或者返回Response前对Response做一下处理 。
为了支持中间件 , 在TopWebF目录下创建middleware.py文件,在编写代码前,思考一下如何实现?
回顾一下现在请求的调度逻辑 。
1.通过routes装饰器关联路由和方法 2.通过API.whitenoise处理 3.如果是请求API接口,那么会将参数传递给API.wsgi_app 4.API.wsgi_app最终会调用API.handle_request方法获取路由对应的方法并调用该方法执行相应的逻辑
如果希望在request前以及response后做相应的操作,那么其实就需要让逻辑在API.handle_request前后执行,看一下代码 。
其中add方法会实例化Middleware对象,该对象会将当前的API类实例包裹起来 。
Middleware.handle_request方法其实就是在self.app.handle_request前调用self.process_request方法处理request前的数据以及调用self.process_response处理response后的数据,而核心的调度逻辑,依旧交由API.handle_request方法进行处理 。
这里的代码可能会让人感到疑惑,__call__方法和handle_request方法中都有self.app.handle_request(request),但其调用对象似乎不同?这个问题暂时放一下,先继续完善代码 , 然后再回来解释 。
接着在api.py中为API创建middleware属性以及添加新中间件的方法 。
随后,在app.py中 , 自定义一个简单的中间件,然后调用add_middleware方法将其添加 。
定义好中间件后,在请求调度时,就需要使用中间件 , 为了兼容静态文件的情况,需要对css、js、ing文件的请求路径做一下兼容,在其路径中加上/static前缀
紧接着,修改API的__call__,兼容中间件和静态文件,代码如下 。
至此,中间件的逻辑就完成了 。
但代码中依旧有疑惑,Middleware类中的__call__方法和handle_request方法其调用的self.app到底是谁?
为了方便理解 , 这里一步步拆解 。
如果没有添加新的中间件 , 那么请求的调度逻辑如下 。
在没有添加中间件的情况下,self.app其实就是API本身,所以middleware.__call__中的self.app.handle_request就是调用API.handle_request 。
如果添加了新的中间件 , 如上述代码中添加了名为SimpleCustomMiddleware的中间件,此时的请求调度逻辑如下 。
因为注册中间件时,Middleware.add方法替换了原始Middleware实例中的app对象 , 将其替换成了SimpleCustomMiddleware,而SimpleCustomMiddleware也有app对象,SimpleCustomMiddleware中的app对象,才是API类实例 。
在请求调度的过程中,就会触发Middleware类的handle_request方法 , 该方法就会执行中间件相应的逻辑去处理request和response中的数据 。
当然,你可以通过Middleware.add方法添加多个中间件,这就会构成栈式调用的效果,代码如下 。
启动web服务后,其执行效果如下 。
【python函数调度框架 python进程调度算法】python函数调度框架的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于python进程调度算法、python函数调度框架的信息别忘了在本站进行查找喔 。

    推荐阅读