以下谈论的 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. javascript函数小练习

    求n-m之间数据的和 <script> function num(n,m){ var sum=0; for (var i = n; i <= m; i++) { sum+=i; } ...

  2. 【Git学习笔记】撤销修改

    工作区下的.git文件夹其实是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为 stage 的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向master的一个 ...

  3. [dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)

    对例子IP Fragmentation的熟悉,使用,以及源码分析. 功能: 该例子的功能有二: 一: 将IP分片? 二: 根据路由表,做包转发. 路由表如下: IP_FRAG: Socket : ad ...

  4. SQLite 加密 -- SQLCipher

    SQLite3 插件 github 下载地址 插件配置步骤地址 购买地址 其他加密方式介绍 SQLCipher API 地址 前言 应用使用 SQLite 来存储数据,很多时候需要对一部分的数据进行加 ...

  5. 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别

    一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...

  6. SET QUOTED_IDENTIFIER ON和SET ANSI_NULLS ON

    distinct是sqlserver的标识符,如果想以distinct为表时,在QUOTED_IDENTIFIER为off的情况下,是不能创建表名为distinct的表的,因为在QUOTED_IDEN ...

  7. 通过href简单实现单击a链接跳转到页面指定位置

    在页面中点击a标签后,要使其跳到页面里面相应的地方,方法很简单,就是在a标签里面href中的内容和你要跳到这个区域的id同名即可,例如: <a href="#ppp" tar ...

  8. PHP会话管理:cookie和session

    PHP会话管理1.cookie数据存储在浏览器端方便与JavaScript交换数据方便获取用户信息风险-浏览器可能会禁用cookie替代方案-URL参数 2.session数据存储在服务器高效.安全. ...

  9. ora-02292

    select  table_name from all_constraints where constraint_name = '约束的名称'

  10. 。。。IO流学习之二。。。

    fileReader的用法: import static org.junit.Assert.*; import java.io.File; import java.io.FileNotFoundExc ...