scrapy基本使用(二)

参考链接: http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html#id5

scrapy基本使用(一) http://www.cnblogs.com/zhaijiahui/p/6973858.html

了解一些基础,接下来我们该从源码里,扒出你想要的东西了。

这里就要用到一个叫选择器(Selectors)的东西了。

首先思考几个问题:

1)选择器的作用是什么?

从网页源码中提取出想要的数据。我理解python中的re,BeautifulSoup作用类似。

2)选择器如何工作?

用的是XPath,在xml和html上的节点语言,什么是节点语言?我理解这里就是在匹配一个个标签<div>,<a>,<span>等等,这样匹配的效率更高更准确。

下面是如何使用选择器

3)如何使用选择器?

3.1 官方的使用方法

from scrapy.selector import Selector

这样只需要调用Selector(response)就等价于scrapy.selector.Selector(response)

3.2 如何使用XPath来匹配内容呢?

举个例子:

body = '<html><body><span>good</span></body></html>'

Selector(text=body).xpath('//span/text()').extract()

注意到我们要找的内容在<span>标签里面,可以用//span/来定位,而我们要获取标签里面包裹的内容,用text()来获取。

而前面.xpath() 及 .css() 方法返回的是一个类 SelectorList 的实例, 它是一个新选择器的列表。需要调用extract()最后成功获取good。

response.xpath('//title/text()').extract() 等价于 response.css('title::text').extract()

当源码是这种情况的时候,

<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>

xpath用法:

>>> response.xpath('//a[contains(@href, "image")]/@href').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']

contains代表href里面包含”image”的内容,最后还需要@href确定取得是href的内容

css用法:

>>> response.css('a[href*=image]::attr(href)').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']

当我们像这样把数据都挑出来以后

    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

最后获取数据需要用 yield

yield是一个生成器,他可以记录调用之前的数据信息(各个参数的值),和位置信息(在框架中跳转以后依然能回来执行),而上次调用的所有局部变量都保持不变。

可以参考:Python yield 用法 http://www.pythonclub.org/python-basic/yield

保存爬取到的数据

scrapy crawl dmoz -o items.json

该命令将采用 JSON 格式对爬取的数据进行序列化,生成 items.json 文件。

在类似本篇教程里这样小规模的项目中,这种存储方式已经足够。 如果需要对爬取到的item做更多更为复杂的操作,您可以编写 Item Pipeline 。

scrapy基本使用(二)的更多相关文章

  1. scrapy框架(二)

    scrapy框架(二) 一.scrapy 选择器 概述: Scrapy提供基于lxml库的解析机制,它们被称为选择器. 因为,它们“选择”由XPath或CSS表达式指定的HTML文档的某部分. Sca ...

  2. Scrapy 框架(二)数据的持久化

    scrapy数据的持久化(将数据保存到数据库) 一.建立项目 1.scrapy startproject dushu 2.进入项目 cd dushu 执行:scrapy genspider -t cr ...

  3. Python爬虫框架Scrapy实例(二)

    目标任务:使用Scrapy框架爬取新浪网导航页所有大类.小类.小类里的子链接.以及子链接页面的新闻内容,最后保存到本地. 大类小类如下图所示: 点击国内这个小类,进入页面后效果如下图(部分截图): 查 ...

  4. scrapy爬虫笔记(二)------交互式爬取

    开始网页爬取:(1)交互式爬取 首先,我们使用scrapy建立起爬虫的框架.在命令行中输入 scrapy shell “url” 如:scrapy shell “http://www.baidu.co ...

  5. 浅谈 Scrapy 爬虫(二)

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

  6. Scrapy基础(二)————Scrapy的安装和目录结构

    Scrapy安装: 1,首先进入虚拟环境    2,使用国内豆瓣源进行安装,快! pip install -i https://pypi.douban.com/simple/ scrapy 3,特殊情 ...

  7. scrapy系列(二)——startproject、genspider创建项目与模板使用

    阅读本文之前需要安装scrapy,如果你还没有安装该框架,那么可以看之前一篇文章scrapy1.2windows安装. 现在默认大家都已经成功的安装了scrapy可以开始大展身手了.本文主要讲的是新建 ...

  8. Python3爬虫(十八) Scrapy框架(二)

    对Scrapy框架(一)的补充 Infi-chu: http://www.cnblogs.com/Infi-chu/ Scrapy优点:    提供了内置的 HTTP 缓存 ,以加速本地开发 .   ...

  9. Scrapy 笔记(二)

    一个scrapy爬虫知乎项目的笔记 1.通过命令创建项目 scrapy startproject zhihucd zhihuscrapy genspider zhihu www.zhihu.com(临 ...

  10. 爬虫框架Scrapy之案例二

    新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: items.py import scrapy import sys reload(s ...

随机推荐

  1. WebService 及 CXF 的进阶讲解

    4.2. WebService请求深入分析 1). 分析WebService的WSDL文档结构 1.1). 实例截图 <definitions> <types> <sch ...

  2. 对C# .Net4.5异步机制测试(二)——加深印象

    public static void Main() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); In(); Console.W ...

  3. 无法删除foo.length

  4. Tennis Game CodeForces - 496D(唯一分解定理,费马大定理)

    Tennis Game CodeForces - 496D 通过排列组合解决问题. 首先两组不同素数的乘积,是互不相同的.这应该算是唯一分解定理的逆运用了. 然后是,输入中的素数,任意组合,就是n的因 ...

  5. AVL平衡二叉树

    AVL树 1.若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值. 2.若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值. 3.它的左右子树也分别可以充当为二叉查找树. 例如: ...

  6. maven编译或者打包web项目显示“软件包 javax.servlet.http 不存在"

    2.解决办法: 这是由于缺少servlet-api.jar包,其实tomcat下有,但是在java build path把他加载过来,还是报这个错误,所以我们直接在pom.xml里面加入这个jar包即 ...

  7. python调用shell命令之三慷慨法

    preface: 忙于近期的任务,须要用到libsvm的一些命令.如在终端执行java svm_train train_file model_file. pythonsubset.py file tr ...

  8. 数据库中in和exists关键字的区别

    数据库中in和exists关键字的区别 in 是把外表和内表作hash join,而exists是对外表作loop,每次loop再对内表进行查询. 一直以来认为exists比in效率高的说法是不准确的 ...

  9. centos 7 上zabbix 3.0 服务端安装

    zabbix服务端安装 安装完毕mysql-5.6.php5.6 mysql-5.6安装:https://www.cnblogs.com/xzlive/p/9771642.html  创建zabbix ...

  10. java中用jdom创建xml文档/将数据写入XML中

    import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; i ...