Django最佳实践(中文版)

最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题、时间、正文等)。问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata这类标准。这时候所有网页共用一套默认规则无法保证正确抓取到信息,而每个网页写一份spider代码也不切实际。

这时候,我迫切地希望能有一个框架可以通过只写一份spider代码和维护多个网站的爬取规则,就能自动抓取这些网站的信息,很庆幸 Scrapy 可以做到这点。鉴于国内外关于这方面资料太少,所以我将这段时间来的经验和代码分享成了本文。

为了讲清楚这件事,我分成了三篇文章来叙述:

  1. 编程方式下运行 Scrapy spider
  2. 使用Scrapy定制可动态配置的爬虫
  3. 使用Redis和SQLAlchemy对Scrapy Item去重并存储

本篇文章主要介绍如何使用编程的方式运行Scrapy爬虫。

在开始本文之前,你需要对 Scrapy 有所熟悉,知道 Items、Spider、Pipline、Selector 的概念。如果你是 Scrapy 新手,想了解如何用Scrapy开始爬取一个网站,推荐你先看看官方的教程

运行一个Scrapy爬虫可以通过命令行的方式(scrapy runspider myspider.py)启动,也可以使用核心API通过编程的方式启动。为了获得更高的定制性和灵活性,我们主要使用后者的方式。

我们使用官方教程中的 Dmoz 例子来帮助我们理解使用编程方式启动spider。我们的 spider 文件dmoz_spider.py 长这个样子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

import scrapy

class DmozItem(scrapy.Item):

title = scrapy.Field()

link = scrapy.Field()

desc = scrapy.Field()

class DmozSpider(scrapy.Spider):

name = "dmoz"

allowed_domains = ["dmoz.org"]

start_urls = [

"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",

"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"

]

def parse(self, response):

for sel in response.xpath(‘//ul/li‘):

item = DmozItem()

item[‘title‘] = sel.xpath(‘a/text()‘).extract()

item[‘link‘] = sel.xpath(‘a/@href‘).extract()

item[‘desc‘] = sel.xpath(‘text()‘).extract()

yield item

接下来我们需要写一个脚本run.py,来运行DmozSpider:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

from dmoz_spider import DmozSpider

# scrapy api

from scrapy import signals, log

from twisted.internet import reactor

from scrapy.crawler import Crawler

from scrapy.settings import Settings

def spider_closing(spider):

"""Activates on spider closed signal"""

log.msg("Closing reactor", level=log.INFO)

reactor.stop()

log.start(loglevel=log.DEBUG)

settings = Settings()

# crawl responsibly

settings.set("USER_AGENT", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36")

crawler = Crawler(settings)

# stop reactor when spider closes

crawler.signals.connect(spider_closing, signal=signals.spider_closed)

crawler.configure()

crawler.crawl(DmozSpider())

crawler.start()

reactor.run()

然后运行python run.py就启动了我们的爬虫了,但是由于我们这里没有对爬下来的结果进行任何的存储操作,所以看不到结果。你可以写一个 item pipline 用来将数据存储到数据库,使用settings.set接口将这个 pipline 配置到ITEMS_PIPLINE,我们将在第三篇文章中具体讲解这部分内容。下一篇博客将会介绍如何通过维护多个网站的爬取规则来抓取各个网站的数据。

你可以在 GitHub 上看到本文的完整项目。

注:本文使用的 Scrapy 版本是 0.24,GitHub 上的master分支已支持 Scrapy 1.0

本系列的三篇文章

  1. Python爬虫框架Scrapy教程(1)——入门
  2. Python爬虫框架Scrapy教程(2)—动态可配置
  3. Python爬虫框架Scrapy教程(3)—使用Redis和SQLAlchemy对Scrapy Item去重并存储

参考资料

时间: 2024-11-08 15:25:20

Django最佳实践(中文版)的相关文章

Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05-17, 修改日期: 2014-05-18 在Django 1.6中的settings.py中可以修改130多项设置, 但大多数都继承自默认值. 设置是在web服务器启动时首次载入的, 服务器重启时重新载入, 因此, 程序员们应尽量避免修改正式服务器上使用的settings.py文件. 以下是一些我们

[Celery]Celery 最佳实践

orangleliu 翻译 原文点击查看 如果你的工作和 Django 相关, 并且有时候需要执行一些长时间的后台任务.可能你已经使用了某种任务队列,Celery就是Python(和Django)世界中时下解决类似问题最受欢迎的项目. 当在某些项目使用Celery作为任务队列之后,我总结了一些最佳实践,决定把它们些下来.然而,这里也有一些对自己应该做的却没做的反思,还有一些celery提供但是没有充分利用的功能. No.1 不要使用关系型数据库来作为AMQP的代理 让我来解释下我为什么觉得这是错

Celery最佳实践(转)

原文  http://www.cnblogs.com/ajianbeyourself/p/3889017.html 作为一个Celery使用重度用户,看到 Celery Best Practices 这篇文章,干脆翻译出来,同时也会加入我们项目中celery的实战经验. 通常在使用Django的时候,你可能需要执行一些长时间的后台任务,没准你可能需要使用一些能排序的任务队列,那么Celery将会是一个非常好的选择. 当把Celery作为一个任务队列用于很多项目中后,作者积累了一些最佳实践方式,譬

Python 最佳实践指南

粗粗粗略地过了一遍,大体捞了一些东西出来,大段大段英文太费眼了,回头细读在更新进来 浓缩版,20分钟可大体过完,然后根据自己需要去看详细的吧 整体内容还是很不错的,建议细读英文 PS:文档含有巨量的TODO(没写空白着待补充的),不过但从目录上来看还是很强大滴,相信完善后,会成为一份很牛逼的指南(难度比官方指南高一点点) 第零部分 Getting Started 链接 不解释,不翻译,自个看….真的没啥(每本入门书籍第一章…) 第一部分 Writing Great Code Structurin

atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 。打开浏览服务器文件夹java .net php

atitit. web 在线文件管理器最佳实践(1)--- elFinder 的使用流程解决之道 .打开浏览服务器文件夹java .net php 1. 环境:::项目java web,需要打开浏览服务器文件夹挑选文件,在返回... 1 2. 在线文件管理器要实现的基本的功能::指定开始目录,指定getfile回调 1 3. 组件选型:: elFinder (3M) ,,php web ftp 1 4. elFinder 的概念 1 5. elFinder  1.x 的使用过程 2 6. elF

Code Review最佳实践

Code Review最佳实践 原文链接 : Code Review Best Practices 原文作者 : Kevin London 译文出自 : 开发技术前线 www.devtf.cn 译者 : ayyb1988 校对者: chaossss 状态 : 完成 在Wiredrive上,我们做了很多的Code Review.在此之前我从来没有做过,这对于我来说是一个全新的体验,下面来总结一下在Code Review中做的事情以及说说Code Review的最好方式. 简单的说,Code Rev

celery最佳实践

作为一个Celery使用重度用户,看到Celery Best Practices这篇文章,不由得菊花一紧.干脆翻译出来,同时也会加入我们项目中celery的实战经验. 至于Celery为何物,看这里Celery. 通常在使用Django的时候,你可能需要执行一些长时间的后台任务,没准你可能需要使用一些能排序的任务队列,那么Celery将会是一个非常好的选择. 当把Celery作为一个任务队列用于很多项目中后,作者积累了一些最佳实践方式,譬如如何用合适的方式使用Celery,以及一些Celery提

celery最佳实践(转)

原文:http://my.oschina.net/siddontang/blog/284107 目录[-] 1,不要使用数据库作为你的AMQP Broker 2,使用更多的queue(不要只用默认的) 3,使用具有优先级的workers 4,使用Celery的错误处理机制 5,使用Flower 6,没事别太关注任务退出状态 7,不要给任务传递 Database/ORM 对象 最后 作为一个Celery使用重度用户,看到Celery Best Practices这篇文章,不由得菊花一紧.干脆翻译出

Git 最佳实践:分支管理

5月份,为统一团队git分支管理规范,刚开始准备自己写,在网上搜了下,发现不少不错的git分支管理实践.最后我为团队选择了这个git分支管理实践 A successful Git branching model ,网上有不少参考这篇文章写的中文版gitflow实践,推荐一个中文版的Git 最佳实践:分支管理. 除了团队git管理的需要,我自己在github上有重要的开源项目采用github flow,这里转载一篇关于这两种分支管理的文章:GitHub Flow & Git Flow 基于Git