以下谈论的 scrapy 基于 0.20.2 版本(当前最新版本是 0.22.0 ),python 2.7.6。

开发环境是windows 7 sp1。

 

互联网上比较有价值的参考资料

1. Scrapy入门教程

对官网文档的翻译,主要讲了 scrapy 的基本使用。创建一个工程,使用 item 和 spider 。我们会简单涉及到官方教程的内容。

2. 使用scrapy进行大规模抓取

这篇文章并未涉及到代码细节,介绍了一些使用 scrapy 的经验,用的是较老的0.9版本。我们会对该文章涉及到的内容简单展开。

 

一 安装 scrapy

因为不同的版本 scrapy 依赖库变换很大,网上的安装教程版本太老,所以我的建议是直接安装 scrapy ,运行 scrapy 时 python 打印的错误可以看出是缺少了哪个库,缺了哪个安装哪个。

安装 scrapy 后 会多出 python/Scripts 目录,记得添加到环境变量,这样才能直接在命令行使用“scrapy”命令。

 

二 创建项目

在命令行运行 “scrapy startproject 项目名”可以直接在当前目录创建 scrapy 工程。

工程目录会有如下文件:

scrapy.cfg

配置文件,开发中基本用不到。

ajian\item.py

这里主要处理递归爬取和返回页面数据。

ajian\pipelines.py

返回的数据会传到这里,进行下一步处理。存储到数据库或者进行分析,随你喜欢。

ajian\settings.py

设置文件,有很多有趣的设置,比如是深度还是广度爬,对每个IP的爬虫数,每个域名的爬虫数,总爬虫数,爬虫延时等等。

ajian\__init__.py

ajian\spider\__init__.py

上述两个文件是 python 包要求的文件,对 scrapy 作用不大。

 

三 构建第一个蜘蛛

使用命令构建的项目默认生成了 pipelines.py 却没有生成 spider.py 文件,有点让人摸不着头脑。不过无所谓,我们自己写一个就好了。在 spider 新建文件 ajian_spider.py 内容如下。

from scrapy.spider import BaseSpider

class AJianSpider(BaseSpider):
name = "ajian"
start_urls = [
"http://www.163.com/"
] def parse(self, response):
print response.body

其中 name 变量和 start_urls 是必须的,name 变量是启动 scrapy 抓取时指定的蜘蛛名, start_urls 是初始抓取的 url,是个 list,可以指定多个。现在一个最简单的蜘蛛就做好了,只有一个功能,输出163的页面内容。

这个蜘蛛太逊了,我们加上最基本的功能,返回页面内容、递归爬取。

在讲返回页面内容和递归爬取之前,先了解一些背景知识。

spider.py 文件中的 parse 函数实际是个迭代器,python 有一个命令 yield ,有一篇文章很详细的说明了 yield 的作用。这里简略描述一下。当调用 yield 时,不仅会返回值,还会记录当前函数的状态,在下次调用函数时,会从调用 yield 的下一句开始执行。相当于函数执行到一半,先返回给调用者一个结果,再接着执行。

parse 可以返回两种对象,一种是 item 另外一种是 Request,分别对应着页面内容和递归请求。

如果返回的是Request,那么会将这个返回结果放到待抓取列表;如果返回的是item,则会传递到pipelines.py进行处理。

 

待续。。。

浅谈Scrapy爬虫(一)的更多相关文章

  1. 浅谈 Scrapy 爬虫(二)

    越写越像官方文档的翻译,偏离了初衷.写一些官方文档里没有的内容吧.   在不限制宽带的环境下,根据页面的大小, Scrapy 一秒能爬取40-70个页面,一天在400万到600万页面.也就是说 Scr ...

  2. crawler_浅谈网络爬虫

    题记: 1024,今天是个程序猿的节日 ,哈哈,转为正题,从事了一线网络爬虫开发有近1000天.简单阐述下个人对网络爬虫的理解. 提纲: 1:是什么 2:能做什么 3:怎么做 4:综述 1:是什么 w ...

  3. 浅谈scrapy框架安装使用

    Scrapy笔记: 一 安装: pip3 install wheel pip3 install lxml pip3 install pyopenssl pip3 install -i https:// ...

  4. 浅谈网络爬虫爬js动态加载网页(二)

    没错,最后我还是使用了Selenium,去实现上一篇我所说的问题,别的没有试,只试了一下firefox的引擎,总体效果对我来说还是可以接受的. 继续昨天的话题,既然要实现上篇所说的问题,那么就需要一个 ...

  5. 浅谈网络爬虫爬js动态加载网页(一)

    由于别的项目组在做舆情的预言项目,我手头正好没有什么项目,突然心血来潮想研究一下爬虫.分析的简单原型.网上查查这方面的资料还真是多,眼睛都看花了.搜了搜对于我这种新手来说,想做一个简单的爬虫程序,所以 ...

  6. 浅谈网络爬虫爬js动态加载网页(三)

    上一篇讨论了web driver对动态网页的抓取与分析,可以很清楚的看出这是一种集中式处理方式,简单说,就是利用服务器,打开一个真正的brower,然后将需要解析的地址交给浏览器,浏览器去解析,然后将 ...

  7. scrapy分布式浅谈+京东示例

    scrapy分布式浅谈+京东示例: 学习目标: 分布式概念与使用场景 浅谈去重 浅谈断点续爬 分布式爬虫编写流程 基于scrapy_redis的分布式爬虫(阳关院务与京东图书案例) 环境准备: 下载r ...

  8. 浅谈爬虫 《一》 ===python

    浅谈爬虫 <一> ===python  ‘’正文之前先啰嗦一下,准确来说,在下还只是一个刚入门IT世界的菜鸟,工作近两年了,之前做前端的时候就想写博客来着,现在都转做python了,如果还 ...

  9. python浅谈正则的常用方法

    python浅谈正则的常用方法覆盖范围70%以上 上一次很多朋友写文字屏蔽说到要用正则表达,其实不是我不想用(我正则用得不是很多,看过我之前爬虫的都知道,我直接用BeautifulSoup的网页标签去 ...

随机推荐

  1. (绝对官方好用,快速上手)针对grunt之前写的那篇有些乱,这次总结个清晰的

    安装 Grunt基于Node.js,安装之前要先安装Node.js,然后运行下面的命令. sudo npm install grunt-cli -g grunt-cli表示安装的是grunt的命令行界 ...

  2. mycat的读写分离设置

    官网:http://www.mycat.org.cn/ 一.jdk环境的安装1.安装jdk1.7,这是mycat推荐的jdk环境 2.之前是用yum安装的jdk1.6,首先查找下 #yum info ...

  3. 【java基础学习】IO流

    IO流 字节流InputStream和OutputStream 字符流Writer和Reader 装饰模式

  4. 表单验证:$tablePrefix(定义表前缀);$trueTableName = 'yonghu',找到真实表名(yonghu)表;create($attr,0)两个参数;批量验证(返回数组);ajax+动态验证表单

    *$tablePrefix是定义在Model中的,优先级大于配置文件中,如果项目中表前缀全部比如为"a_",并且在配置文件中定义了 'DB_PREFIX'=>'a_' 后期如 ...

  5. 《Linux内核分析》期末总结

    Linux内核设计期中总结 版权声明:本文为博主原创文章,未经博主允许不得转载. 前八周博客汇总及总结 Linux内核设计第一周——从汇编语言出发理解计算机工作原理 我们学习了汇编语言的基础知识,这一 ...

  6. python多线程实现同时执行两个while循环

    如果想同时执行两个while True循环,可以使用多线程threading来实现. 完整代码 #coding=gbk from time import sleep, ctime import thr ...

  7. ng-selected ng-change

    <!DOCTYPE HTML><html ng-app="myApp"><head><meta http-equiv="Cont ...

  8. Java实现归并排序

    package Sort; import java.util.Arrays; public class MergeSort { public static void merge(int[] list, ...

  9. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增查询引擎管理

    欲了解V3.0版本的相关内容可查看下面的链接地址. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本发布 RDIFramework.NET — 基于.NET的快速信 ...

  10. [原创] [YCM] YouCompleteMe安装完全指南

    因为实在实在受不鸟ctags了: 代码中有很多类具有相同名字的变量, 比如 "id". 当我想看下当前的这个 "id" 到底是哪个id的时候, 可怕的事情粗线了 ...