首先我们来说说css选择器;其实在上面的概述:和scrapy相关的函数就这么三个而已:response.css("css表达式")、extract()、extract_first()。有变化的就是:css表达式的写法,这里我们就列举一些常见的表达式,虽然不能囊括100%的爬取任务,但可以很负责的说,至少可以囊括90%的爬取,这里小编会把常见的给诸位列举哈,诸位见类似的便可直接依葫芦画瓢使用了。按照HTML标签的结构可以分为:标签属性值提取、标签内容提取,我们分别介绍对应的情况;

1、标签属性值的提取

href的值URL的提取:这是最常见的,我们要进入下一页、或是打开内容页……都少不了URL值,如下面这段HTML,我们来提取一下里面的URL

<ol class="page-navigator">
<li class="current"><a href="http://lab.scrapyd.cn/page/1/">1</a></li>
<li><a href="http://lab.scrapyd.cn/page/2/">2</a></li>
<li><a href="http://lab.scrapyd.cn/page/3/">3</a></li>
<li><a href="http://lab.scrapyd.cn/page/4/">4</a></li>
</ol>

这其实是我们爬虫实验室的分页,如果我们要爬取下一页,我们该如何提取URL呢?提取属性我们是用:“标签名::attr(属性名)”,比如我们要提取url表达式就是:a::attr(href),要提取图片地址的表达式就是:img::attr(src)……以此类推,好了知道scrapy给我们提供的提取变了的工具,那我们就可以提取上面的URL了,有多种方式,首先我们可以直接:

response.css("a::attr(href)")

然后,我们调试一下,看是不是我们想要的结果,cmd输入:

scrapy shell lab.scrapy.cn

然后我们发现结果并非是我们想要的分页URL,而是页面中所有的URL:

Out[3]:
['http://lab.scrapyd.cn/',
'http://lab.scrapyd.cn/archives/57.html',
'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
……
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
……
'http://lab.scrapyd.cn/page/6/',
'http://lab.scrapyd.cn/page/2/',
'http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/',
……
'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
'http://lab.scrapyd.cn/tag/%E7%94%9F%E6%B4%BB/',
……
'http://lab.scrapyd.cn/']

这当然不是我们想要的,我们想要的只是分页的URL,那这要怎么办?那我们就需要限定一下我们URL的范围,最好的方法就是找到我们要提取目标最近的class或是id,可以看到这段代码中有个class="page-navigator",那我们就可以这样来写:

response.css(".page-navigator a::attr(href)").extract()

当这样限定之后,我们发现这就成功提取了我们想要的URL,灰常的完美!随便解释哈上面的:.page-navigator,其中点代表class选择器,如果代码中是:id=“page-navigator”,那我们这里就要写成:“#page-navigator”,大家如果不清楚可以去这里看看:https://www.runoob.com/css/css-id-class.html;

再来一个提取标签属性的栗子,最常见的就是我们的图片地址,也就是要提取图片的src值,如下面网页:

<article class="post" itemscope="" itemtype="http://schema.org/BlogPosting">
<h1 class="post-title" itemprop="name headline"><a itemprop="url" href="http://lab.scrapyd.cn/archives/57.html">中国传世名画</a></h1>
<div class="post-content" itemprop="articleBody">
<p>看官,此页面只为爬虫练习使用,都是残卷,若喜欢可以去找点高清版!</p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/3875934880.jpg" alt="1.jpg" title="1.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/2269613152.jpg" alt="2.jpg" title="2.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/2360992798.jpg" alt="3.jpg" title="3.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/2239103416.jpg" alt="4.jpg" title="4.jpg"></p>
<p><img src="http://lab.scrapyd.cn/usr/uploads/2018/02/4145232684.jpg" alt="5.jpg" title="5.jpg"></p>
</div>
<p itemprop="keywords" class="tags">标签: <a href="http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/">艺术</a>, <a href="http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/">名画</a></p>
</article>

这个页面是我们爬虫实验室:http://lab.scrapyd.cn/archives/57.html的文章,我们要提取里面图片的地址供scrapy下载,有上面的基础就很简单了:首先找到隔img最近的class或id,可以看到有个:class="post-content",于是我们可以这样写表达式:

response.css(".post-content img::attr(src)").extract()

调试的话自己试哈,经过这个表达式:".post-content img::attr(src),可以看到已经成功提取出来:

Out[2]:
['http://lab.scrapyd.cn/usr/uploads/2018/02/3875934880.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/2269613152.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/2360992798.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/2239103416.jpg',
'http://lab.scrapyd.cn/usr/uploads/2018/02/4145232684.jpg']

好了上面便是提取标签属性的方法,利用的就是:标签名::attr(属性名),关键点就是如何缩小范围!

2、标签内容的提取

设么是标签内容,比如:

<p>scrapy中文网</p>

<div>scrapy中文网:www.scrapyd.cn</div>

<h1>scrapy实验室:lab.scrapyd.cn</h1>

<title>scrapy中文网</title>

上面标签:p、div、h1里面的文字便是标签内容,那我们要如何提取呢?用到了scrapy给我提供的这么一个方法:“::text”,比如要提取上面p标签里面的内容,我们可以这样:

response.css("p::text").extract()

那接下来我们就演示哈如何提取scrapy中文网:http://www.scrapd.cn的title:

<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Scrapy 中文网</title>

提取方式:

response.css("title::text").extract()

上面的这个栗子灰常简单,应为tittle标签是页面唯一的标签,所以在title前不用加什么限制,当你发现标签不唯一的时候,我们就需要缩小范围,原理和上面标签属性提取一样,要么找最近的class、要么找最近的id,然后最终缩小提取访问,这样就能让提取很准确,如下面这个例子:

<div class="left">
scrapy中文网左边
</div> <div class="center">
scrapy中文网中部
</div> <div class="right">
scrapy中文网右侧
</div>

如果我们要提取第二个div里面的内容,我们肯定不能这样:

response.css("div::text").extract()

如果这样提取的话,我们肯定得不到正确的结果,我们还需要限制哈范围,找到最近的class=“center”,最终表达式如下:

response.css(".center::text").extract()

这样的话就能正确提取我们想要的内容;下面我们再介绍一个最常用的提取方式:含有嵌套标签文字的提取,HTML如下:

<div class="post-content" itemprop="articleBody">
<p>如果你因失去了太阳而流泪,那么你也将失去群星了。 <br>
If you shed tears when you miss the sun, you also miss the stars.
</p>
<p>
<a href="http://www.scrapyd.cn">scrapy中文网(</a><a href="http://www.scrapyd.cn">http://www.scrapyd.cn</a>)整理
</p>
</div>

如果我们要提取class=“post-content”里面的所有文字,我们需要怎么办呢?显然上面的知识无法做到。这段文字是scrapy实验室:http://lab.scrapyd.cn/archives/28.html 里的文章,诸位可以scrapy shell进行验证结果,可以记住用下面的方式:

response.css(".post-content *::text").extract()

可以看到,“::tex“t前面有个“*”号,这是一个小技巧,一般人我都告诉他,学着点!好了,上面的一些常见的内容已经说了些;接下来我们来说一些比较复杂的表达式,大家根据情况使用:

3、CSS 高级用法:

CSS选择器用于选择你想要的元素的样式的模式。"CSS"列表示在CSS版本的属性定义(CSS1,CSS2,或对CSS3)。

选择器 示例 示例说明 CSS
.class .intro 选择所有class="intro"的元素 1
#id #firstname 选择所有id="firstname"的元素 1
* * 选择所有元素 2
element p 选择所有<p>元素 1
element,element div,p 选择所有<div>元素和<p>元素 1
element element div p 选择<div>元素内的所有<p>元素 1
element>element div>p 选择所有父级是 <div> 元素的 <p> 元素 2
element+element div+p 选择所有紧接着<div>元素之后的<p>元素 2
[attribute] [target] 选择所有带有target属性元素 2
[attribute=value] [target=-blank] 选择所有使用target="-blank"的元素 2
[attribute~=value] [title~=flower] 选择标题属性包含单词"flower"的所有元素 2
[attribute|=language] [lang|=en] 选择一个lang属性的起始值="EN"的所有元素 2
:link a:link 选择所有未访问链接 1
:visited a:visited 选择所有访问过的链接 1
:active a:active 选择活动链接 1
:hover a:hover 选择鼠标在链接上面时 1
:focus input:focus 选择具有焦点的输入元素 2
:first-letter p:first-letter 选择每一个<P>元素的第一个字母 1
:first-line p:first-line 选择每一个<P>元素的第一行 1
:first-child p:first-child 指定只有当<p>元素是其父级的第一个子级的样式。 2
:before p:before 在每个<p>元素之前插入内容 2
:after p:after 在每个<p>元素之后插入内容 2
:lang(language) p:lang(it) 选择一个lang属性的起始值="it"的所有<p>元素 2
element1~element2 p~ul 选择p元素之后的每一个ul元素 3
[attribute^=value] a[src^="https"] 选择每一个src属性的值以"https"开头的元素 3
[attribute$=value] a[src$=".pdf"] 选择每一个src属性的值以".pdf"结尾的元素 3
[attribute*=value] a[src*="runoob"] 选择每一个src属性的值包含子字符串"runoob"的元素 3
:first-of-type p:first-of-type 选择每个p元素是其父级的第一个p元素 3
:last-of-type p:last-of-type 选择每个p元素是其父级的最后一个p元素 3
:only-of-type p:only-of-type 选择每个p元素是其父级的唯一p元素 3
:only-child p:only-child 选择每个p元素是其父级的唯一子元素 3
:nth-child(n) p:nth-child(2) 选择每个p元素是其父级的第二个子元素 3
:nth-last-child(n) p:nth-last-child(2) 选择每个p元素的是其父级的第二个子元素,从最后一个子项计数 3
:nth-of-type(n) p:nth-of-type(2) 选择每个p元素是其父级的第二个p元素 3
:nth-last-of-type(n) p:nth-last-of-type(2) 选择每个p元素的是其父级的第二个p元素,从最后一个子项计数 3
:last-child p:last-child 选择每个p元素是其父级的最后一个子级。 3
:root :root 选择文档的根元素 3
:empty p:empty 选择每个没有任何子级的p元素(包括文本节点) 3
:target #news:target 选择当前活动的#news元素(包含该锚名称的点击的URL) 3
:enabled input:enabled 选择每一个已启用的输入元素 3
:disabled input:disabled 选择每一个禁用的输入元素 3
:checked input:checked 选择每个选中的输入元素 3
:not(selector) :not(p) 选择每个并非p元素的元素 3
::selection ::selection 匹配元素中被用户选中或处于高亮状态的部分 3
:out-of-range :out-of-range 匹配值在指定区间之外的input元素 3
:in-range :in-range 匹配值在指定区间之内的input元素 3
:read-write :read-write 用于匹配可读及可写的元素 3
:read-only :read-only 用于匹配设置 "readonly"(只读) 属性的元素 3
:optional :optional 用于匹配可选的输入元素 3
:required :required 用于匹配设置了 "required" 属性的元素 3
:valid :valid 用于匹配输入值为合法的元素 3
:invalid :invalid 用于匹配输入值为非法的元素 3

Spider-Scrapy css选择器提取数据的更多相关文章

  1. scrapy框架Selector提取数据

    从页面中提取数据的核心技术是HTTP文本解析,在python中常用的模块处理: BeautifulSoup  非常流行的解析库,API简单,但解析的速度慢. lxml 是一套使用c语言编写的xml解析 ...

  2. scrapy 中用selector来提取数据的用法

      一. 基本概念 1. Selector是一个可独立使用的模块,我们可以用Selector类来构建一个选择器对象,然后调用它的相关方法如xpaht(), css()等来提取数据,如下 from sc ...

  3. 使用 CSS 选择器从网页中提取数据

    在 R 中,关于网络爬虫最简单易用的扩展包是 rvest.运行以下代码从 CRAN 上安装:install.packages("rvest")首先,加载包并用 read_html( ...

  4. 初始scrapy,简单项目创建和CSS选择器,xpath选择器(1)

    一 安装 #Linux: pip3 install scrapy #Windows: a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu ...

  5. 第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器

    第三百四十节,Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器 css选择器 1. 2. 3.  ::attr()获取元素属性,css选择器 ::text获取标签文本 举例: extr ...

  6. 十九 Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器

    css选择器 1. 2. 3.  ::attr()获取元素属性,css选择器 ::text获取标签文本 举例: extract_first('')获取过滤后的数据,返回字符串,有一个默认参数,也就是如 ...

  7. 在scrapy中利用Selector来提取数据

    1.创建对象 Selector类的实现位于scrapy.selector模块,创建Selector对象的时候,可以将页面的Html文档字符串传递给Selector构造器方法 2.选中数据 调用Sele ...

  8. 爬虫学习笔记(2)--创建scrapy项目&&css选择器

    一.手动创建scrapy项目---------------- 安装scrapy: pip install -i https://pypi.douban.com/simple/  scrapy    1 ...

  9. scrapy xpath、正则表达式、css选择器

    scrapy xpath XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力. 学习 ...

随机推荐

  1. pip 的具体含义

    Python 2.7.9 and later (on the python2 series), and Python 3.4 and later include pip (pip3 for Pytho ...

  2. ppt自动制作器

    讲一篇论文导入进入,自动生成该论文的展示ppt,啧啧啧,想想岂不是很美妙

  3. Logstash读取文本信息并写入到ES

    Logstash读取文本信息并写入到ES 前提是ELK安装没问题 进入到logstash安装目录下的bin目录(我的logstash安装目录:/usr/local/) [root@es1 bin]# ...

  4. 洛谷 P3368 【模板】树状数组 2(区间修改点查询)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  5. CalService

    package org.crazyit.cal; import java.math.BigDecimal; /** * 计算业务类 * * @author yangenxiong yangenxion ...

  6. 2017团体程序设计天梯赛大区赛 L3-3 球队“食物链”

    思路: 状压dp. 实现: #include <iostream> #include <cstdio> #include <cstring> using names ...

  7. 让px单位自动转换为rem的方法

    开发工具:      编辑器:vscode;     css预处理器:less;(无具体要求): 步骤:   1. vscode安装cssrem插件:   2. 修改css插件的默认配置,其默认转换p ...

  8. 掌握Spark机器学习库-07.14-保序回归算法实现房价预测

    数据集 house.csv 数据集概览 代码 package org.apache.spark.examples.examplesforml import org.apache.spark.ml.cl ...

  9. Java:核心概念j积累(一)

    1.      抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过 ...

  10. R in action读书笔记(14)第十一章 中级绘图 之一:散点图(高能预警)

    第十一章中级绘图 本章内容: 二元变量和多元变量关系的可视化 绘制散点图和折线图 理解相关图 学习马赛克图和关联图 本章用到的函数有: plot hexbin ablines iplot scatte ...