飞污熊博客

静下心来做一件事

Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便。

Item提供了类字典的API,并且可以很方便的声明字段,很多Scrapy组件可以利用Item的其他信息。

阅读全文 »

在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务:

  1. BeautifulSoup是python中一个非常流行的抓取库, 它还能合理的处理错误格式的标签,但是有一个唯一缺点就是:它运行很慢。
  2. lxml是一个基于ElementTree 的XML解析库(同时还能解析HTML), 不过lxml并不是Python标准库

而Scrapy实现了自己的数据提取机制,它们被称为选择器,通过XPathCSS表达式在HTML文档中来选择特定的部分

  • XPath是一用来在XML中选择节点的语言,同时可以用在HTML上面。
  • CSS是一种HTML文档上面的样式语言。

Scrapy选择器构建在lxml基础之上,所以可以保证速度和准确性。

本章我们来详细讲解下选择器的工作原理,还有它们极其简单和相似的API,比lxml的API少多了,因为lxml可以用于很多其他领域。

完整的API请查看Selector参考

阅读全文 »

Spider是爬虫框架的核心,爬取流程如下:

  1. 先初始化请求URL列表,并指定下载后处理response的回调函数。初次请求URL通过start_urls指定,调用start_requests() 产生Request对象,然后注册parse方法作为回调
  2. 在parse回调中解析response并返回字典,Item对象,Request对象或它们的迭代对象。Request 对象还会包含回调函数,之后Scrapy下载完后会被这里注册的回调函数处理。
  3. 在回调函数里面,你通过使用选择器(同样可以使用BeautifulSoup,lxml或其他工具)解析页面内容,并生成解析后的结果Item。
  4. 最后返回的这些Item通常会被持久化到数据库中( 使用Item Pipeline) 或者使用Feed exports将其保存到文件中。

尽管这个流程适合于所有的蜘蛛,但是Scrapy里面为不同的使用目的实现了一些常见的Spider。下面我们把它们列出来。

阅读全文 »

这篇文章我们通过一个比较完整的例子来教你使用Scrapy,我选择爬取虎嗅网首页的新闻列表。

这里我们将完成如下几个步骤:

  • 创建一个新的Scrapy工程
  • 定义你所需要要抽取的Item对象
  • 编写一个spider来爬取某个网站并提取出所有的Item对象
  • 编写一个Item Pipline来存储提取出来的Item对象

Scrapy使用Python语言编写,如果你对这门语言还不熟,请先去学习下基本知识。

阅读全文 »

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则可以分为三种方式。

  • 使用ORM避免直接书写sql
  • 使用raw sql直接书写sql
  • 使用sql expression,通过SQLAlchemy的方法写sql表达式
阅读全文 »

最今天我又折腾了我的博客,将它从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应用,不但开发效率高,而且运行速度快。

阅读全文 »