以下谈论的 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. DoModal时带出次级窗口闪现

    最近在做MFC 界面开发. 在一个CDialog窗口DoModal模态显示时, 会将次级窗口带出闪现(比如将一个窗口active, 然后点击我现在程序需要弹框的按钮,弹出弹出正常,但原来active的 ...

  2. extjs后自己写了一些见不得人的脚本

    <html> <head> <title> 配置管理器 </title> <style type="text/css"> ...

  3. Mybatis学习记录

    参考资料: <深入理解mybatis原理> MyBatis的架构设计以及实例分析

  4. localstorage 的属性改变问题

    localstorage 得到的是对象,我们打算改对象的某个属性的值,方法是 通过临时变量对象得到,改变临时变量,然后把临时变量给localstorage的方法 var localS  = windo ...

  5. SQL update join on 连接更新

    http:/how-can-i-do-an-update-statement-with-join-in-sql create table sale ( id int, udid int, assid ...

  6. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  7. C# 接口笔记

    /* 1. 实现多态的两种方式.             *    使用虚方法实现多态.             *    使用抽象方法实现多态.             *              ...

  8. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

  9. Runtime实战之定制TabBarItem大小

    方案一:UIEdgeInsets 适用场景: 适合APP的TabBarItemImage的图片资源放在本地 图片超出tabbar的高度,需移动其位置,来进行适应 弊端: 若在本地配置好后,tabbar ...

  10. [SharePoint 2013] Automatic deployment script

    Implement automatic deployment through windows task. Add-PsSnapin Microsoft.SharePoint.PowerShell $t ...