scrapy框架的学习,目前个人觉得比较详尽的资料主要有两个:

1.官方教程文档、scrapy的github wiki;

2.一个很好的scrapy中文文档:http://scrapy-chs.readthedocs.org/zh_CN/0.24/index.html

剩下的就是网上其他的一些demo。

一、scrapy框架结构

还是先上个图吧,这个图几乎在网上一搜scrapy随处可见,其实它很好地反应了这个框架的运作流程及各个组件之间交互的过程。

scrapy之所以能作为框架,是因为其抽取了普通爬虫的共同特征和基本原理并加以封装,有没有发现其实我们之前写的各种爬虫,原理其实都大同小异?什么抓页面、存储、解析页面、提取特征信息……爬虫就这么几个步骤,当然工业界的爬虫可能还要考虑更多比如爬虫效率、稳定性、分布式爬虫协调、兼容、信息清洗判重、数据结构化存储等等。一般程序员的习惯是在写过程序之后总想着重构一下,抽出一些公共的方法将其模板化,下次再用时就方便了。是的,你当然可以将自己写过的代码重构,但是这些工作早就有人帮做好了,直接拿来用甚至还比你自己写的要方便:“scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫”。并且其优秀的思想也是值得借鉴的——入门阶段:学会怎么使用scrapy,调用其接口能完成一个爬虫的功能;提高阶段:研究scrapy的源码也很有必要,看看一个优秀的爬虫框架是怎么写的。

scrapy的几个组件:

(1) Scrapy Engine(引擎):整体驱动数据流和控制流,触发事务处理。

(2) Scheduler(调度):维护一个引擎与其交互的请求队列,引擎发出请求后返还给它们。

(3) Downloader(下载器):下载网页,将网页给蜘蛛Spider.

(4) Spider(蜘蛛):这个是核心,一个蜘蛛能处理一个域名或一组域名,作用是定义特定网站的抓取和解析规则。定义对于不同网页结构,处理的方式也不一样,需要定义不同的蜘蛛。

蜘蛛抓取流程:

  • step1:调用start_requests()获取第一个url请求,请求返回后调取回调函数parse。
  • step2:回调函数中解析网页,返回项目对象请求对象两者的迭代。请求也包含一个回调,然后被scrapy下载,然后指定其他回调处理。
  • step3:回调函数parse()中解析网页,方法:Xpath选择器(或者可以用BeautifulSoup, lxml等),生成解析的数据项。
  • step4:蜘蛛spider返回项目给项目管道Item Pipeline。

(5) Item Pipeline(项目管道):处理蜘蛛解析过后的数据结果,清洗、验证、存储数据,存放给item字段field。

(6) Downloader middlewares(下载器中间件):引擎与下载器之间的钩子框架,处理引擎与下载器之间的请求/响应。可以自定义代码来扩展scrapy。

(7) Spider middlewares(蜘蛛中间件):引擎与蜘蛛之间的钩子框架,处理蜘蛛的响应输入/请求输出。可以自定义代码来扩展scrapy。

(8) Scheduler middlewares(调度中间件):引擎与调度之间的中间件,处理引擎与调度的请求/响应。可以自定义代码来扩展scrapy。

二、Scrapy安装(win/linux)

搭建scrapy框架需要的几个模块:python2.7.6, pywin32, twisted(zope.interface + pyOpenSSL + twisted),lxml, scrapy(安装之前要安装easytool)

1.windows安装

(1) 安装python 2.7:官网下载安装包,双击运行,最后需要将python安装目录添加到系统变量里,然后才能在控制台进入python shell。

(2) 安装pywin32:注意对应python版本,下载地址:http://sourceforge.net/projects/pywin32/files/,或者点击这里下载

(3) 安装twisted

依赖几个包:

(4) 安装lxml:https://pypi.python.org/pypi/lxml/,或者点击这里下载,安装后在cmd进入python shell,如果”import
lxml”没有问题说明安装成功。

(5) 安装scrapy:

2.linux安装

可以按照这里的方法安装:(转载http://www.cnblogs.com/HelloPython/

第一步:为了安装这个packages,在ubuntu下运行lsb_release -cs,显示

第二步:现在需要做的就是用vi添加deb http://archive.scrapy.org/ubuntu precise main 到 /etc/apt/sources.list中去

第三步:然后运行 curl -s http://archive.scrapy.org/ubuntu/archive.key | sudo apt-key add-

第四步:再更新源sudo apt-get update

第五步:最后安装  sudo apt-get install scrapy-0.1X,可选择不同版本,我安装的是0.16

三、scrapy文件结构

1.新建scrapy项目

设定项目名称为mytest,cd到需要创建项目的目录:scrapy startproject mytest,会自动生成目录结构,如下:

	mytest/
scrapy.cfg #-------------------项目配置文件
mytest/
__init__.py
items.py #-------项目数据字段文件
pipelines.py #-------项目管道文件
settings.py #---------项目配置文件
spiders/ #----------项目存放蜘蛛的目录
__init__.py
...

2.文件结构

(1) item.py:项目数据字段文件,定义需要的数据段,这些字段即为爬取下来数据中提取的,可以通过定义Item类实现。

from scrapy.item import Item, Field
class MyItem(Item):
userid = Field()
username = Field()
tweeted = Field()
time = Field()

(2) spider.py:用户自定义蜘蛛,其中:

  • name:网络蜘蛛名称,要唯一
  • start_urls:是网络蜘蛛开始爬取第一个url,可以包括多个url。
  • parse()函数: 网络蜘蛛爬取后response的对象。负责解析响应数据,是spider函数抓到第一个网页以后默认调用的callback,避免使用个这个名字来定义自己的方法。
from scrapy.spider import BaseSpider
class MySpider(BaseSpider):
name = "myspider"
allowed_domains = ["sina.com"]
start_urls = ["http://www.sina.com",
"http://www.sina.com/news"
]
def parse(self, response): #--------------------这就是callback回调函数
filename = response.url.split("/")[-2]
open(filename, 'wb').write(response.body)

(3) pipeline.py:管道文件,接收item各字段对应数据,放到数据库mongodb或mysqldb

(4) setting.py:配置信息

3.spider的选择器Xpath(解析网页)

(1) 选择器的四个基本方法

xpath():返回一个选择器列表,每个代表xpath选择的,当于正则解析

css():返回一选择器列表,每个代表css选择的。

extract():返回一个unicode字符串。

re():返回一个unicode字符串从正则表达式中选出的。

(2) 几个xpath例子

/html/head/title: 选择所有<head>标签内部的<title>标签内容

/html/head/title/text(): 选择所有的位于<title>标签内部的<text>标签(文本)内容

//td: 选择所有的<td>元素

//div[@class="mine"]: 选择所有包含class=”mine“属性的div标签元素

(3) xpath路径表达式:

表达式

描述

nodename

选取此节点的所有子节点

/

从根节点选取

//

从匹配选择的当前节点选择文档中的节点,不考虑它们的位置

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

关于选择器,这个再下一篇python系列五当中会提到具体实例应用,这里暂且先写到这里。

原创文章,转载请注明出处http://blog.csdn.net/dianacody/article/details/39743379

【网络爬虫】【python】网络爬虫(四):scrapy爬虫框架(架构、win/linux安装、文件结构)的更多相关文章

  1. scrapy爬虫学习系列一:scrapy爬虫环境的准备

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  2. 四: scrapy爬虫框架

    5.爬虫系列之scrapy框架   一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架 ...

  3. Python之爬虫(二十四) 爬虫与反爬虫大战

    爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序反爬虫:使用技术手段防止爬虫程序爬取数据误伤:反爬虫技术将普通用 ...

  4. 【网络爬虫】【python】网络爬虫(五):scrapy爬虫初探——爬取网页及选择器

    在上一篇文章的末尾,我们创建了一个scrapy框架的爬虫项目test,现在来运行下一个简单的爬虫,看看scrapy爬取的过程是怎样的. 一.爬虫类编写(spider.py) from scrapy.s ...

  5. python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...

  6. Python网络爬虫与信息提取笔记

    直接复制粘贴笔记发现有问题 文档下载地址//download.csdn.net/download/hide_on_rush/12266493 掌握定向网络数据爬取和网页解析的基本能力常用的 Pytho ...

  7. scrapy爬虫学习系列四:portia的学习入门

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  8. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  9. 手把手教你如何新建scrapy爬虫框架的第一个项目(上)

    前几天给大家分享了如何在Windows下创建网络爬虫虚拟环境及如何安装Scrapy,还有Scrapy安装过程中常见的问题总结及其对应的解决方法,感兴趣的小伙伴可以戳链接进去查看.关于Scrapy的介绍 ...

随机推荐

  1. [javase学习笔记]-8.7 静态代码块

    这一节我们看一个比較特殊的概念,那就是静态代码块. 前面我们也提到过代码块,就是一段独立的代码空间.那么什么是静态代码块呢?说白了,就是用statickeyword修饰的代码块. 我们来看一个样例: ...

  2. (全然背包)小P寻宝记——好基友一起走

    题目描写叙述 话说.上次小P到伊利哇呀国旅行得到了一批宝藏.他是相当开心啊.回来就告诉了他的好基友小鑫.于是他们又结伴去伊利哇呀国寻宝. 这次小P的寻宝之路可没有那么的轻松,他们走到了一个森林,小鑫一 ...

  3. css-装饰

    css -在标签上设置style样式 background-color:#2356a1 height:48px -编写样式方法 1.标签的style属性 2.鞋子head里面,style标签中编写 - ...

  4. commons io上传文件

    习惯了是用框架后,上传功能MVC框架基本都提供了.如struts2,springmvc! 可是假设项目中没有使用框架.而是单纯的使用jsp或servlet作为action,这时我们就能够使用commo ...

  5. 封装EF code first用存储过程的分页方法

    一年半没有做过MVC的项目了,还是很怀念(因为现在项目还是原来的ASPX),个人还是喜欢mvc,最近又开始重拾MVC,感觉既熟悉又陌生. 记录一下封装好的分页代码 首先先说下 我使用EF codefi ...

  6. Python 007- python的各种函数

    1.chr().unichr()和ord() chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符. unichr()跟它一样,只不过返回的是Unicod ...

  7. Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)

    转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46453627 本文出自:[海龙的博客] 一.概述 在上一篇博文中,博文 ...

  8. Android笔记之使用LocationManager获取经纬度

    LocationManager.getLastKnownLocation(String provider)有可能返回null,概率还挺高 findViewById(R.id.llMain).setOn ...

  9. Qt JSON解析生成笔记

    对于这样一段json { "name": "布衣食", "gender": "Male", "age" ...

  10. git基本操作---持续更新(2017-08-11)

    git 强制push $ git push -u origin master -f 查看本地标签 $ git tag 打标签并添加备注 $ git tag 20170811 -m"图片保存多 ...