飞污熊博客

静下心来做一件事

Django是一个非常强大的web框架,能让你快速的构建应用,它本身包含了一个简单的服务器程序,让你在开发环境里调试用。 但是在生产环境中就需要将其部署到更专业的web服务器里去了,比如Apache、Nginx等。

对于Django这个框架的教程我之前的博客已经有一个系列了,这里就不多说,我假设你已经创建好了一个Django工程, 这里我已自己的zspace工程来说明。

阅读全文 »

WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口。具体的来说,WSGI是一个规范, 定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。 最新版本在PEP-3333中定义。

对于初学者来说,上面那段就是废话,说了跟没说一样。接下来详细说明下这个东东到底是如何工作的。

阅读全文 »

开篇我先解释一下两个容易搞混的术语:

  • OSGi: The Open Services Gateway Initiative(开放服务网关协议) ,是用来模块化开发和部署Java应用程序和库(library)的一种架构,已经成为Java模块化事实上的标准了。详细解释请参考OSGi简介
  • WSGI: Web Server Gateway Interface(Web服务器网关接口) ,具体的来说,WSGI是一个Python专用规范,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。最新版本在Python的PEP-3333定义的。详细解释请参考WSGI简介

所以,弄清楚之后才发现只有一个字母的差别,但是这两个东东一毛钱的关系都没有,^_^

跟Java的Servlet协议和EJB协议类似,OSGi协议定义了两件事:一组OSGi容器必须实现的服务,以及容器和你的应用程序之间的接口标准。 也许你会搞不懂为什么我们已经有了Servelt容器来构建Web应用程序,有了EJB容器来构建企业级事务应用程序,那我们还要这个OSGi容器干嘛? 简单来讲就是OSGi容器是特地用来开发非常复杂的大型Java应用程序的,你需要将系统分解成很多个模块。

阅读全文 »

前面我们介绍的都是去抓取静态的网站页面,也就是说我们打开某个链接,它的内容全部呈现出来。 但是如今的互联网大部分的web页面都是动态的,经常逛的网站例如京东、淘宝等,商品列表都是js,并有Ajax渲染, 下载某个链接得到的页面里面含有异步加载的内容,这样再使用之前的方式我们根本获取不到异步加载的这些网页内容。

使用Javascript渲染和处理网页是种非常常见的做法,如何处理一个大量使用Javascript的页面是Scrapy爬虫开发中一个常见的问题, 这篇文章将说明如何在Scrapy爬虫中使用scrapy-splash来处理页面中得Javascript。

阅读全文 »

有时候爬取网站的时候需要登录,在Scrapy中可以通过模拟登录保存cookie后再去爬取相应的页面。这里我通过登录github然后爬取自己的issue列表来演示下整个原理。

要想实现登录就需要表单提交,先通过浏览器访问github的登录页面https://github.com/login,然后使用浏览器调试工具来得到登录时需要提交什么东西。 我这里使用chrome浏览器的调试工具,F12打开后选择Network,并将Preserve log勾上。我故意输入错误的用户名和密码,得到它提交的form表单参数还有POST提交的UR 去查看html源码会发现表单里面有个隐藏的authenticity_token值,这个是需要先获取然后跟用户名和密码一起提交的。

阅读全文 »

有很多时候我们需要从多个网站爬取所需要的数据,比如我们想爬取多个网站的新闻,将其存储到数据库同一个表中。我们是不是要对每个网站都得去定义一个Spider类呢? 其实不需要,我们可以通过维护一个规则配置表或者一个规则配置文件来动态增加或修改爬取规则,然后程序代码不需要更改就能实现多个网站爬取。

要这样做,我们就不能再使用前面的scrapy crawl test这种命令了,我们需要使用编程的方式运行Scrapy spider,参考官方文档

阅读全文 »

本篇主要介绍两种部署爬虫的方案。如果仅仅在开发调试的时候在本地部署跑起来是很容易的,不过要是生产环境,爬虫任务量大,并且持续时间长,那么还是建议使用专业的部署方法。主要是两种方案:

阅读全文 »

Scrapy为我们提供了可重用的item pipelines为某个特定的Item去下载文件。 通常来说你会选择使用Files Pipeline或Images Pipeline。

这两个管道都实现了:

  • 避免重复下载
  • 可以指定下载后保存的地方(文件系统目录中,Amazon S3中)
阅读全文 »

Scrapy使用Python内置的的日志系统来记录事件日志。

日志配置

1
2
3
4
5
6
7
LOG_ENABLED = true
LOG_ENCODING = "utf-8"
LOG_LEVEL = logging.INFO
LOG_FILE = "log/spider.log"
LOG_STDOUT = True
LOG_FORMAT = "%(asctime)s [%(name)s] %(levelname)s: %(message)s"
LOG_DATEFORMAT = "%Y-%m-%d %H:%M:%S"
阅读全文 »

当一个item被蜘蛛爬取到之后会被发送给Item Pipeline,然后多个组件按照顺序处理这个item。 每个Item Pipeline组件其实就是一个实现了一个简单方法的Python类。他们接受一个item并在上面执行逻辑, 还能决定这个item到底是否还要继续往下传输,如果不要了就直接丢弃。

使用Item Pipeline的常用场景:

  • 清理HTML数据
  • 验证被抓取的数据(检查item是否包含某些字段)
  • 重复性检查(然后丢弃)
  • 将抓取的数据存储到数据库中
阅读全文 »