Scrapy笔记01- 入门篇
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说,网络抓取)所设计的, 也可以应用在获取API所返回的数据(比如Web Services)或者通用的网络爬虫。
Scrapy也能帮你实现高阶的爬虫框架,比如爬取时的网站认证、内容的分析处理、重复抓取、分布式爬取等等很复杂的事。
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说,网络抓取)所设计的, 也可以应用在获取API所返回的数据(比如Web Services)或者通用的网络爬虫。
Scrapy也能帮你实现高阶的爬虫框架,比如爬取时的网站认证、内容的分析处理、重复抓取、分布式爬取等等很复杂的事。
前面一篇介绍了SQLAlchemy的入门,这里我讲讲它的进阶用法,其实主要是通过它来轻松实现一些复杂查询。
SQLAlchemy中的映射关系有四种,分别是一对多、多对一、一对一、多对多。接下来我将详细说明怎样去定义这四种关系, 然后再演示怎样通过这四种关系完成复杂的查询和更新。
SQLAlchemy是Python世界中最广泛使用的ORM工具之一,它采用了类似于Java里Hibernate的数据映射模型,
而不是其他ORM框架采用的Active Record
模型。
SQLAlchemy分为两个部分,一个是最常用的ORM对象映射,另一个是核心的SQL expression
。
第一个很好理解,纯粹的ORM,后面这个不是ORM,而是DBAPI的封装,通过一些sql表达式来避免了直接写sql。
使用SQLAlchemy
则可以分为三种方式。
最今天我又折腾了我的博客,将它从octopress迁移到hexo上来。之前还专门写了一篇怎样利用octopress搭建博客的文章, 最近试用了一下hexo,毫不犹豫的迁移过来了,实在是忍受不了octopress的速度,还有稳定性,经常莫名其妙的出错。
hexo是一个台湾人做的基于Node.js的静态博客程序,优势是生成静态文件的速度非常快,支持markdown, 我最终选定它的原因是它速度快而且不容易出错,并且可以一键部署到github或者其它静态服务器上去。折腾了一天总算搞定。
一般将coroutine称之为协程(或微线程,也有称纤程的)。 我在python并发编程那篇文章已经详细讲解了进程Process和线程Thread的用法, 很早就想再写一篇专门讲解coroutine以及相关的优秀库gevent。
目前常见的coroutine应用都是网络程序中,所以我们先来看看各种不同的网络框架模型, 然后再介绍coroutine就会比较理解了。
Web应用开发可以说是目前软件开发中最重要的部分。Web开发也经历了好几个阶段:静态Web页面、CGI、ASP/JSP/PHP、MVC。
目前,Web开发技术仍在快速发展中,异步开发、新的MVVM前端技术层出不穷。
Python的诞生历史比Web还要早,由于Python是一种解释型的脚本语言,开发效率高,所以非常适合用来做Web开发。
Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。
自从互联网诞生以来,现在基本上所有的程序都是网络程序。 网络编程对所有开发语言都是一样的,Python也不例外。 用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信。 本章我们将详细介绍Python网络编程的概念和最主要的两种网络类型的编程。
操作数据库是最常见的任务,这里用MySQL来做演示,也是我们用的最多的一个开源数据库,其他都类似的。
对于安装MySQL就不做介绍了,安装完后,还需要安装去驱动。因为需要支持Python的MySQL驱动来连接到MySQL服务器。 MySQL的驱动有多种实现,比如纯python实现的pymysql和mysql-connector,或者mysql-python也就是MySQLdb。
这里我通过mysql-connector来介绍使用方法:
1 | pip install mysql-connector |
单元测试在所有编程语言中都不陌生,对于一个健壮的软件来讲单元测试是很有必要的, 并且”测试驱动开发”(TDD:Test-Driven Development)越来越受欢迎也说明了它的重要性。
单元测试一个最大的好处,就是确保一个程序模块的行为符合我们设计的测试用例。 在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。
由于CPU的速度远远快于磁盘、网络等IO,我们可选择使用多进程或多线程来并发执行代码。 然而系统不能无限制增加线程,而且切换线程开销也大,一旦线程数量过多,CPU花的时间主要在切换线程上,导致性能下降。
另外一种解决方案是异步IO,当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。 一段时间后,当IO返回结果时,再通知CPU进行处理。
异步IO模型需要一个消息循环,在消息循环中,主线程不断地重复”读取消息-处理消息”这一过程:
1 | loop = get_event_loop() |
息模型是如何解决同步IO必须等待IO操作这一问题的呢?当遇到IO操作时,代码只负责发出IO请求,不等待IO结果, 然后直接结束本轮消息处理,进入下一轮消息处理过程。当IO操作完成后,将收到一条”IO完成”的消息, 处理该消息时就可以直接获取IO操作结果。