简介

  scrapy被认为是比较简单的爬虫框架,资料比较齐全,网上也有很多教程。官网上介绍了它的四种安装方法,PyPI、Conda、APT、Source,我们只介绍最简单的安装方法。

安装

Windows下的安装

  pip install scrapy

Linux下的安装

  apt-get install python-scrapy

  APT

vim编辑器

  因为Linux的强大及辅助工具比较多,大家比较喜欢在Linux下使用scrapy爬虫框架,Linux下编写python代码最强大的工具可属eclipse,但最方便的要属vi的强化版本vim了,对不同的编程语言配合不同的插件,可将vim配置成为一个专属的IDE。

VIM模块

选择器XPath和CSS

  XPath是一门在XML文档中查找信息的语言,可用来在XML文档中对元素和属性进行遍历。它有七点类型的节点:元素、属性、文本、命名空间、处理指令、注释及文档节点(根节点),XML文档是被作为节点树来对待的,树的根被称为根节点。

  XPath使用路径表达式在XML文档中选取节点。

  XPath最常用的路径表达式:

  

  xpath示例代码

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book> <book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book> </bookstore>

  举例说明:

bookstore  选取bookstore元素的所有子节点
/bookstore 选择根元素下的bookstore元素,假如路径起始于/
bookstore/book 选取bookstoe的所有子元素中为book的元素
//book 选取文档中的所有book元素,不管它在什么位置
//bookstore//book 选择属于bookstore元素后代的所有book元素,不管它在什么位置
//@lang 选择所有属性为lang的元素
/bookstore/book[] 选取bookstore子元素中的第一个book元素
/bookstore/book[last()] 选取bookstore子元素中的最后一个book元素
/bookstore/book[last()-] 选取bookstore子元素中倒数第二个book元素
/bookstore/book[postion()<] 选取bookstore子元素中前两个book元素
//title[@lang] 选取所有title元素且其属性拥有lang名
//title[@lang='en'] 选取所有title元素且其属性拥有lang='en'
/bookstore/book[price>] 选取bookstore元素下所有子元素中元素price>30book的元素
/title/text() 提取title标签上的文字
/a/@href 提取a标签的href属性值
response.xpath("//a[contains(.,'下一页')]/text()")[1].extract() # 根据文本内容查找

  未知节点

* 任何元素节点
@* 任何属性节点 /bookstore/* bookstore元素下的所有子元素
//* 当前文档的所有元素
//title[@*] 所有带有属性的title元素

  选取若干路径

//book/title|//book/price       选取book元素下的所有title和price元素
//title|//price 选取文档中的所有title和price元素

  示例代码2:

<superhero>
<class>
<name lang="en">Tony Stark</name>
<alias>Iron Man</alias>
<sex>male</sex>
<birthday></birthday>
<age></age>
</class>
<class>
<name lang="en">Perter Benjamin</name>
<alias>Spider Man</alias>
<sex>male</sex>
<birthday>unknow</birthday>
<age>unknow</age>
</class>
<class>
<name lang="en">Steven Rogers</name>
<alias>Captain America</alias>
<sex>male</sex>
<birthday></birthday>
<age></age>
</class>
</superhero>

分析以上代码:superhero是根节点,alias是元素节点,lang="en"是属性节点。

  小试牛刀

#!/usr/bin/env python
# _*_ coding:utf-8 _*_ from scrapy.selector import Selector with open("superHero.xml",'r') as fp:
body = fp.read() htmlContent = Selector(text=body).xpath("/*").extract()
print htmlContent
结果:XML文件转成了标准的HTML文件,根节点不再是superhero而是html 

  数据收集的比较

#!/usr/bin/env python
# _*_ coding:utf- _*_ from scrapy.selector import Selector with open("superHero.xml",'r') as fp:
body = fp.read() # 采集第一个class节点中的内容,text表示传入的内容是字符串
Selector(text=body).xpath("//superhero/class[0]").extract()
Selector(text=body).css("superhero class:first-child").extract() # 采集最后一个class节点中的内容
Selector(text=body).xpath("//superhero/class[last()]").extract()
Selector(text=body).css("superhero class:last-child").extract() # 采集倒数第二个class节点中name节点的文本,text()表示获取文本
Selector(text=body).xpath("//superhero/class[last()-1]/name/text()").extract()
Selector(text=body).css("superhero class:nth-last-child(2) name").extract()[] # 采集节点name,其属性节点lang='en'的元素,@前缀代表属性名称(@lang代表lang属性,用中括号圈起来)
Selector(text=body).xpath("//name[@lang='en']").extract()
Selector(text=body).css("name[lang='en']").extract() # 嵌套选择器,选择最后一个class节点中sex节点的内容
subBody = Selector(text=body).xpath("//superhero/class[last()]").extract()
Selector(text=subBody[]).xpath("/html/body/class/sex/text()").extract()
Selector(text=subBody[]).xpath("//class/sex/text()").extract()

  CSS:层叠样式表

  CSS经常使用的几个选择器:

  

   css也可以嵌套使用,所以它和xpath可以互相嵌套,使用数据收集功能更加强大。

   CSS示例代码(同示例代码2):

s.css("title::text").extract_first()  # 提取title标签的文本
s.css("base::attr(href)").extract_first() # 提取base标签的herf属性值
s.css("a[href^=image]::attr(href)").extract() # 提取以image开头的属性列表
s.xpath('//a[contains(@href, "image")]/@href').extract() # href属性中包含image字符串列表
s.css('a[href^=image]::text').re(r'Name:\s(.*)') # 正则也可以序列化数据,返回括号中的文本串

好,scrapy的基本情况已经介绍完了,下面来尝试通过使用模板的方式来创建一个爬虫吧。

1、创建一个目录用来存放所有的爬虫工程

$mkdir -p code/crawler/scrapyProject

2、在工程目录下创建首个爬虫工程

cd code/crawler/scrapyProject/

scrapy startproject todayMovie

3、为此工程创建爬虫程序

$ scrapy genspider wuHanMoiveSpider jycimima.com --force

4、使用tree命令查看此工程目录

  第一级todayMovie:此工程名称

  第二级todayMovie: 此工程模块,存放此工程所有的爬虫代码

  scrapy.cfg: 此工程的全局配置文件

  items.py: 定义了一个类,存放爬虫最终爬取的项目,数据最终以字典的形式表现,键值为列表。

  wuHanMoiveSpider.py: 真正的爬虫程序,用来爬取网页内容,并生成item数据。

  settings.py:配置由谁去处理爬取的item数据。

  piplines.py: 逐条处理爬取的item数据。

5、scrapy框架流程图:

scrapy简单入门及选择器(xpath\css)的更多相关文章

  1. [转]Scrapy简单入门及实例讲解

    Scrapy简单入门及实例讲解 中文文档:   http://scrapy-chs.readthedocs.io/zh_CN/0.24/ Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用 ...

  2. Scrapy简单入门及实例讲解

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  3. Scrapy简单入门及实例讲解-转载

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  4. 10,Scrapy简单入门及实例讲解

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  5. scrapy 框架入门

    运行流程 官网:https://docs.scrapy.org/en/latest/intro/overview.html 流程图如下: 组件 1.引擎(EGINE):负责控制系统所有组件之间的数据流 ...

  6. Python中Scrapy框架元素选择器XPath的简单实例

    原文标题:<Python网络爬虫-Scrapy的选择器Xpath> 对原文有所修改和演绎 优势 XPath相较于CSS选择器,可以更方便的选取 没有id class name属性的标签 属 ...

  7. CSS选择器 + Xpath + 正则表达式整理(有空再整理)

    选择器 例子 例子描述 CSS .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 id="firstna ...

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

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

  9. Scrapy爬虫入门系列2 示例教程

    本来想爬下http://www.alexa.com/topsites/countries/CN 总排名的,但是收费了 只爬了50条数据: response.xpath('//div[@class=&q ...

随机推荐

  1. Asp.Net Core 连接Mysql

    上一篇文章里最后在VS里测试是没有问题的,但是在Windows命令行模式下会报错. 首先用dotnet restore命令的时候会出现error: 然后用dotnet run会出现警告,但是依旧会成功 ...

  2. Google Guava--Guava新增集合

    Multiset Multiset 虽然带了个set但是却允许重复元素,与set相同的是不保证元素顺序. 使用场景:获取文章中单词的出现次数 String[] wordArr = new String ...

  3. Numpy基础总结

    一.文件读取 numpy.genfromtxt() 可以用来读取各种文件.常用语法大致如下: numpy.genfromtxt(fname, dtype=<type 'float'>, d ...

  4. 启动mongodb和redis服务器

    一.mongodb sudo service mongod start sudo service mongod restart sudo service mongod stop 二.redis red ...

  5. dynamic解析Http xml格式响应数据

    继续上一篇 构建RESTful风格的WCF服务 ,咱已经把服务端的数据和服务准备好了,客户端调用 wcf rest接口后如何解析xml?下面使用dynamic关键字解析来至于WCF REST XML响 ...

  6. j2ee高级开发技术课程第二周(web请求的整个过程、XML)

    博客非原创,只是收集整理了一下网上的一些文章 一.web请求的整个过程 1)把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括 ...

  7. lintcode-->哈希函数

    在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数.一个好的哈希函数可以尽可能少地产生冲突.一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基 ...

  8. 文件触发式实时同步 Rsync+Sersync Rsync+Inotify-tools

    一.概述 1.Rsync+Sersync 是什么? 1)Sersync使用c++编写基于inotify开发的触发机制: 2)Sersync可以监控所监听的目录发生的变化(包括新建.修改.删除),具体到 ...

  9. Ionic3与Angular4新特性

    之前(17年3月底)Angular4.0.0正式发布,这个月(4月十几号)Ionic3又发布了,很多人看到这个估计都是一脸懵圈,其实,Angular4只是Angular2的后续版本,Ionic3也是I ...

  10. jQuery 效果 - 停止动画

    jQuery 停止动画 jQuery stop() 方法用于在动画或效果完成前对它们进行停止. jQuery stop() 方法 jQuery stop() 方法用于停止动画或效果,在它们完成之前. ...