FreeNeb Scripy Release

来自cslt Wiki
跳转至: 导航搜索

1. Scrapy简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。 a) 结构图

b) 组件 i. 引擎(Scrapy) 用来处理整个系统的数据流处理, 触发事务(框架核心) ii. 调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 iii. 下载器(Downloader) 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) iv. 爬虫(Spiders) 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面 v. 项目管道(Pipeline) 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。 vi. 下载器中间件(Downloader Middlewares) 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。 vii. 爬虫中间件(Spider Middlewares) 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。 viii. 调度中间件(Scheduler Middewares) 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。 2. 安装 a) 先安装anaconda,这个集成了Python很多现成的库,安装scrapy的依赖包都包含了。 b) pip install Scrapy 3. 创建项目 a) Scrappy startproject xinlanwang xinlanwang 结果如下

b) 文件说明 • scrapy.cfg 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中) • items.py 设置数据存储模板,用于结构化数据 • pipelines 数据处理行为,如:一般结构化的数据持久化 • settings.py 配置文件,如:递归的层数、并发数,延迟下载等。如果要爬取的网站禁止爬虫,修改ROBOTSTXT_OBEY这个参数为false即可。 • spiders.py 爬虫目录,如:创建文件,编写爬虫规则,必须要继承scrapy.Spider类,name变量不能为空,这个name就是允许爬虫的时候要输入的名字。必须要有一个parse函数,负责解析内容或者url,爬虫源码中默认调用parse函数。定义需要爬取的url,放在列表中,因为可以爬取多个url,Scrapy源码是一个For循环,从上到下爬取这些url,使用生成器迭代将url发送给下载器下载url的html 4. 定义Item a) 解释,是保存到的爬到的数据的容器,和字典一样,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。 b) 代码,其实就像python的字典一样调用就行 class Product(scrapy.Item):

   name = scrapy.Field()
   price = scrapy.Field()
   stock = scrapy.Field()
   last_updated = scrapy.Field(serializer=str)

product = Product(name='Desktop PC', price=1000, stock = "dongfangcaifu") print product {'name': 'Desktop PC', 'price': 1000, 'stock': 'dongfangcaifu'} 5. 编写爬虫脚本 a) 代码 import scrapy

class DmozSpider(scrapy.Spider):

   name = "xinlanwang"
   allowed_domains = ["dmoz.org"]
  # 爬这个list中的url
   start_urls = [
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]
   def parse(self, response):
       filename = response.url.split("/")[-2]
       with open(filename, 'wb') as f:
           f.write(response.body)

b) 爬取,scrapy crawl xinlanwang,scrapy为spider的start_urls属性中的每个url创建scrapy.Request对象,并将parse方法作为回调函数赋值给了Request。Request对象经过调度,执行生成scrapy.http.Request对象并送回给spider的parse()方法。 c) 提取Item i. Selector选择器 xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。 css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表. extract(): 序列化该节点为unicode字符串并返回list。 re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。 ii. 简单的Xpath举例 /html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素 /html/head/title/text(): 选择上面提到的 <title> 元素的文字 //td: 选择所有的 <td> 元素 //div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素 iii. Shell中使用选择器 1. 需要安装ipython工具,就是一个在shell里找selector的方法,比如输入 scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/ 后返回response对象,具有xpath等属性方便调试selector d) 使用item提取数据,对于简单的item提取可以放在spider中,较为复杂的可以编写 Item Pipeline文件 i. 代码 import scrapy

from tutorial.items import DmozItem

class DmozSpider(scrapy.Spider):

   name = "xinlanwang"
   allowed_domains = ["dmoz.org"]
   start_urls = [
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]
   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

ii. 运行并保存数据 1. scrappy crawl xinlanwang –o item.json 6. 下载器中间件(Download Middlewares) 下载中间件是处于引擎(crawler.engine)和下载器(crawler.engine.download())之间的一层组件,可以有多个下载中间件被加载运行。 当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等); 在下载器完成http请求,传递响应给引擎的过程中, 下载中间件可以对响应进行处理(例如进行gzip的解压等) 要激活下载器中间件组件,将其加入到 DOWNLOADER_MIDDLEWARES 设置中。 该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。