1. 安装Scrapy包

  • pip install scrapy, 安装教程
  • Mac下可能会出现:OSError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/pyasn1'
  • 应该是权限问题,解决方案:sudo pip install scrapy

2. 使用教程

1. 创建一个Scrapy工程

scrapy startproject tutorial

  1. tutorial/
  2. scrapy.cfg # 配置文件
  3. tutorial/ # 工程的python模块,你将从这里引入你的代码
  4. __init__.py
  5. items.py # 工程的项目文件
  6. pipelines.py # 工程的流水线文件
  7. settings.py # 工程的设置文件
  8. spiders/ # 你将安放爬虫程序的目录
  9. __init__.py
2. 定义Item
  • Items是将要被爬虫数据加载的容器,工作方式类似于Python的字典(dict),在Scrapy中,也可以使用原生的Python字典,但是Iterms提供了一些额外的保护机制防止写未申明的域和防止拼写错误。
  • 创建一个scrapy.Item类,然后定义它的属性scrapy.Field(),类似于ORM(关系对象模型)
  • quotes.toscrape.com中的文本和作者为例,在items.py中编辑如下代码:
  1. import scrapy
  2. class QuoteItem(scrapy.Item):
  3. text = scrapy.Field()
  4. author = scrapy.Field()
3. 定义爬虫程序

创建一个爬虫,首先要继承scrapy.Spider,并且定义一些属性:

  • name: 定义这个爬虫的名字,在同一个工程中必须是唯一的。
  • start_urls: 开始爬虫的url列表
  • parse(): 定义爬虫的方法,也叫做下载每个url的响应(Response)对象,response作为此方法第一个也是唯一一个参数。 此方法的主要作用是:解析响应数据和提取爬取数据中更多的url
  • 在spiders目录中创建quotes_spider.py文件,并编写以下代码:
  1. import scrapy
  2. class QuotesSpider(scrapy.Spider):
  3. name = "quotes"
  4. start_urls = [
  5. 'http://quotes.toscrape.com/page/1/',
  6. 'http://quotes.toscrape.com/page/2/',
  7. ]
  8. def parse(self, response):
  9. filename = 'quotes-' + response.url.split("/")[-2] + '.html'
  10. with open(filename, 'wb') as f:
  11. f.write(response.body)
4. 开始爬虫

在工程的顶层目录执行以下命令:

scrapy crawl quotes

解释过程:其实是对start_urls中的链接进行http请求,然后对请求的结果进行解析,也就是执行parse()函数。

5. 提取其中的Item

(1). 引入选择器(Selectors)

有许多方法从web页面中提取数据,Scrapy采用的是一种基于XPath和CSS表达式的机制,叫做Scrapy Selector。

以下是几个XPath的表达式及其含义:

  • /html/head/title : 从html标签中的head标签中选择title元素, 等价的CSS选择器: html > head > title
  • /html/head/title/text() : 选择title中的text, 等价的CSS选择器:html > head > title ::text
  • //td : 从文档中选择所有的 元素, 等价的CSS选择器: td
  • //div[@class="mine"] : 选择一个包含属性 class="mine"的div, 等价的CSS选择器: div.mine, @表示属性

CSS VS XPath: 提取数据可以只用CSS选择器,但是XPath的功能更加强大,因为除了可以定位结构以外,它还可以查询内容,例如选择那些链接内容中包含"Next Page"的链接。所以鼓励使用XPath。

为了方便CSS和XPath的表达,Scrapy提供了Selector类和方便的快捷键来避免当每次从响应中选择某些文本时候都自己写选择器。

你可以将选择器看作是文档结构中表示节点的对象。所以第一个需要写的选择器是和根节点有关的。

选择器有以下四个基本的方法:

  • xpath(): 返回一个选择器列表,每一个都表示xpath表达式作为参数选择的节点。
  • css(): 返回一个选择列表,同上。
  • extract(): 返回选择数据的统一编码字符串。
  • re(): 返回一个利用正则表达式作为参数所提取的统一编码的字符串的列表。

(2). 在shell中尝试选择器

好处就是可以直接得到一个response变量,然后可以直接执行一些选择器即可看到响应的结果,例如:

scrapy shell "http://quotes.toscrape.com" (链接一定要用引号引起来)

  1. [ ... Scrapy log here ... ]
  2. 2016-09-01 18:14:39 [scrapy] DEBUG: Crawled (200) <GET http://quotes.toscrape.com> (referer: None)
  3. [s] Available Scrapy objects:
  4. [s] crawler <scrapy.crawler.Crawler object at 0x109001c90>
  5. [s] item {}
  6. [s] request <GET http://quotes.toscrape.com>
  7. [s] response <200 http://quotes.toscrape.com>
  8. [s] settings <scrapy.settings.Settings object at 0x109001610>
  9. [s] spider <DefaultSpider 'default' at 0x1092808d0>
  10. [s] Useful shortcuts:
  11. [s] shelp() Shell help (print this help)
  12. [s] fetch(req_or_url) Fetch request (or URL) and update local objects
  13. [s] view(response) View response in a browser
  14. >>>
  15. In [1]: response.xpath('//title')
  16. Out[1]: [<Selector xpath='//title' data=u'<title>Quotes to Scrape</title>'>]
  17. In [2]: response.xpath('//title').extract()
  18. Out[2]: [u'<title>Quotes to Scrape</title>']
  19. In [3]: response.xpath('//title/text()')
  20. Out[3]: [<Selector xpath='//title/text()' data=u'Quotes to Scrape'>]
  21. In [4]: response.xpath('//title/text()').extract()
  22. Out[4]: [u'Quotes to Scrape']
  23. In [11]: response.xpath('//title/text()').re('(\w+)')
  24. Out[11]: [u'Quotes', u'to', u'Scrape']

(3). 提取数据

代码如下:

  1. import scrapy
  2. class QuotesSpider(scrapy.Spider):
  3. name = "quotes"
  4. start_urls = [
  5. "http://quotes.toscrape.com/page/1/",
  6. "http://quotes.toscrape.com/page/2/",
  7. ]
  8. def parse(self, response):
  9. for quote in response.xpath('//div[@class="quote"]'):
  10. text = quote.xpath('span[@class="text"]/text()').extract_first()
  11. author = quote.xpath('span/small/text()').extract_first()
  12. print(u'{}: {}'.format(author, text))

(4). 利用我们的Item

代码如下:

  1. import scrapy
  2. from tutorial.items import QuoteItem
  3. class QuotesSpider(scrapy.Spider):
  4. name = "quotes"
  5. start_urls = [
  6. 'http://quotes.toscrape.com/page/1/',
  7. 'http://quotes.toscrape.com/page/2/',
  8. ]
  9. def parse(self, response):
  10. for quote in response.xpath('//div[@class="quote"]'):
  11. item = QuoteItem()
  12. item['text'] = quote.xpath('span[@class="text"]/text()').extract_first()
  13. item['author'] = quote.xpath('span/small/text()').extract_first()
  14. yield item

(5). 跟踪链接

代码如下:

  1. import scrapy
  2. from tutorial.items import QuoteItem
  3. class QuotesSpider(scrapy.Spider):
  4. name = "quotes"
  5. start_urls = [
  6. 'http://quotes.toscrape.com/page/1/',
  7. ]
  8. def parse(self, response):
  9. for quote in response.xpath('//div[@class="quote"]'):
  10. item = QuoteItem()
  11. item['text'] = quote.xpath('span[@class="text"]/text()').extract_first()
  12. item['author'] = quote.xpath('span/small/text()').extract_first()
  13. yield item
  14. next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()
  15. if next_page:
  16. next_page = response.urljoin(next_page)
  17. yield scrapy.Request(next_page, callback=self.parse)

(6). 存储爬到的数据

scrapy crawl quotes -o items.json

将产生items.json文件,并且是JSON格式的数据。

在大的项目中,可能需要写Item Pipeline.

scrapy基础教程的更多相关文章

  1. 0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

    目录 0.0.Scrapy基础 0.1.Scrapy 框架图 0.2.Scrapy主要包括了以下组件: 0.3.Scrapy简单示例如下: 0.4.Scrapy运行流程如下: 0.5.还有什么? 0. ...

  2. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  3. <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫

    并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...

  4. Memcache教程 Memcache零基础教程

    Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...

  5. Selenium IDE 基础教程

    Selenium IDE 基础教程 1.下载安装     a 在火狐浏览其中搜索附件组件,查找 Selenium IDE     b 下载安装,然后重启firefox 2.界面讲解      在菜单- ...

  6. html快速入门(基础教程+资源推荐)

    1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...

  7. [转]Scrapy入门教程

    关键字:scrapy 入门教程 爬虫 Spider 作者:http://www.cnblogs.com/txw1958/ 出处:http://www.cnblogs.com/txw1958/archi ...

  8. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  9. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

随机推荐

  1. sourceTreee设置忽略的文件

    1.忽略不想要的目录,比如bin.obj目录(每次运行本机程序都会变化) 这个在右上角的Settings的Advanced下面的Repository-specific ignore list,点击Ed ...

  2. TCP心跳 | TCP keepAlive(转)

    应用层对于每个socket采用如下函数来开启 keepalive机制,其参数将采用系统上述配置. setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&a ...

  3. Linux 挂载U盘

    命令模式下挂载,图形的一般可以自动识别. #fdisk -l      --查看linux 硬盘分区 这个/dev/sdg1 就是我的U盘了,这里挂载的fat格式的 # mount /dev/sdg1 ...

  4. (转)学习使用Jmeter做压力测试(一)--压力测试基本概念

    一.性能测试的概念 性能测试是通过自动化的测试工具模拟多种正常峰值及异常负载条件来对系统的各项性能指标进行测试.负载测试和压力测试都属于性能测试,两者可以结合进行. 通过负载测试,确定在各种工作负载下 ...

  5. 论文阅读(Weilin Huang——【AAAI2016】Reading Scene Text in Deep Convolutional Sequences)

    Weilin Huang--[AAAI2016]Reading Scene Text in Deep Convolutional Sequences 目录 作者和相关链接 方法概括 创新点和贡献 方法 ...

  6. 安装freetds小记

    FreeTDS的软件获取:在官网上进行下载:http://www.freetds.org/ 执行以下命令: ./configure --with-tdsver=7.1 --enable-msdblib ...

  7. mysql5.6.23免安装配置

    1.官网下载,并解压 2.环境变量,path下,追加mysql的bin路径D:\Program Files\mysql\bin; 3.mysql目录下的my-default.ini重命名为my.ini ...

  8. .net之工作流工程展示及代码分享(三)数据存储引擎

    数据存储引擎是本项目里比较有特色的模块. 特色一,使用接口来对应不同的数据库.数据库可以是Oracle.Sqlserver.MogoDB.甚至是XML文件.采用接口进行对应: public inter ...

  9. (五)SQL入门 数据库查询

    什么是查询?查询就是Select语句对数据库的探究. 查询是一种目的,一种需求,一种期望.是Select语句去实现的.Select语句不是只是指select语句,而是多个子句一起使用得组合. sele ...

  10. getStyle(obj, attr)兼容获取css

    设置元素(element)的css属性值可以用element的style属性,dom.style.attr  这样或取得到的值大多数是undefined:何解? dom.style.attr  是用来 ...