爬虫框架Scrapy 之(一) --- scrapy整体认识

Scrapy框架简介

  scrapy是基于Twisted的一个第三方爬虫框架,许多功能已经被封装好,方便提取结构性的数据。

  其可以应用在数据挖掘,信息处理等方面。提供了许多的爬虫的基类,可更简便使用爬虫。

  Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码。

  对于会阻塞线程的操作包含访问文件、数据库或者Web、产生新的进程并需要处理新进程的输出(如运行shell命令)、

  执行系统层次操作的代码(如等待系统队列),Twisted提供了允许执行上面的操作但不会阻塞代码执行的方法。

  Scrapy 的组成部分: 1. 引擎、2.下载器、3. 爬虫、4. 调度器、5. 管道(item和pipeline)

  以上五部分 只需要关注 爬虫管道 即可

  1. spiders:蜘蛛或爬虫,分析网页的地方,主要的代码写在这里
  2. 管道:    包括item和pipeline,用于处理数据
  3. 引擎:    用来处理整个系统的数据流,触发各种事务(框架的核心)
  4. 下载器: 用于下载网页内容,并且返回给蜘蛛(下载器基于Twisted的高效异步模型)
  5. 调度器: 用来接收引擎发过来的请求,压入队列中等处理任务

Scrapy框架安装

Mac安装步骤

  1. 安装依赖库Twisted。 打开终端  pip  install  twisted
  2. 安装其框架Scrapy。 pip install scrapy

wid安装步骤

  1. 在线安装和Mac相同, pip  install   twisted
  2. 离线安装 需要在网站http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted下载响应的版本,然后想下载好的文件拖到 pip install 后面
  3. 安装其框架和Mac相同
  4. 安装 pip   install   pywin32

Scrapy工程

工程创建

  1. 先在终端: cd到存放的目录下并进入虚拟环境
  2. 创建项目: scrapy startproject 工程项目名
    1. cd到项目的根目录                                 [一个项目一个虚拟环境的创建虚拟环境方式]  
    2. 虚拟环境: mkvirtualenv 虚拟环境名            [建虚拟环境要在项目的根目录下建]
    3. 进入环境: source 虚拟环境名/bin/activate  [虚拟环境目录在此项目的根目录下]
    4. 建包文件: touch requirements.txt              [新建一个txt文件,用来存放安装的工具包名称]
    5. 进入文件: vim requirements.txt                 [编辑输入需要的包文件名称,并保存退出]
    6. 执行文件: pip install -r requirements.txt     [执行该文件会安装里面的包文件;可以pip freeze > requirements.txt生成该文件]
    7. 创建爬虫: scrapy genspider 爬虫名 域名     [爬虫名最好起爬哪一个板块叫哪一个板块名称,不要和项目名同名]
    8. 打开项目: 用pycharm打开此项目。
  3. 然后再在: pycharm中打开此项目(空工程)          
  4. 创建爬虫: scrapy genspider 爬虫名 该网站域名    pycharm终端[gyp@localhost ~/pyword/spider05/MyScrapy] $scrapy genspider budejie budejie.com
  5. 运行爬虫: scrapy crawl 爬虫名 [-o xx.json/xml/csv] scrapy crawl qiubai -o budejie.json
  6. 代码调试: scrapy shell 
  7. 查看版本: scrapy version
  8. 具体查看: 查看运行scrapy的python版本:
    1.  which scrapy 找到scrapy文件存储路径 。scrapy文件是一个可执行文件(也可说是一个python文件)
    2.  vim  查找到的路径。打开此可执行文件后的第一行 #!表示执行此可执行文件的解释器(python)的路径
    3.  此python解释器的路径 -V   即可知道此执行文件scrapy的解释器python的版本号是多少。

工程配置: 

  1. 在spiders里面解析数据 (解析)。spiders目录下budejie.py为主要的爬虫代码,包括了对页面的请求以及页面的处理
  2. 根据需求编写item (爬取)。 items.py里存放的是要爬取数据的字段信息
  3. 在管道中处理解析完的数据 (存储)。pipeline主要是对spiders中爬虫的返回的数据的处理,可以写入到数据库,也可以写入到文件。

整体思路:


简单体验:

  •  scrapy genspider lab lab.scrapyd.cn
  •  lab.py 爬虫文件中
 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 
 4 class LabSpider(scrapy.Spider):
 5     name = 'lab'
 6     allowed_domains = ['lab.scrapyd.cn']
 7     start_urls = ['http://lab.scrapyd.cn/']
 8     # response是<class 'scrapy.http.response.html.HtmlResponse'>类型。
 9     # HtmlResponse继承自TextResponse;TextResponse继承自Response
10     def parse(self, response):
11         # 将response中的内容打印
12         print(response.text)
13         # scrapy中默认支持xpath和css选择器方式。源码TextResponse有显示
14         # xp = response.xpath('//*[@id="main"]/ol/li[@class="next"]/a/@href')
15         # xp = response.css('.next a::attr(href)')
16         xp = response.xpath('//*[@id="main"]/ul/li/a/@href')
17         print(xp.extract_first())  # 获取第一个
18         print(xp.extract())        # 获取所有,复数在列表中存
19         print(xp.get())            # 获取第一个
20         print(xp.getall())         # 获取所有,复数在列表中存。如果没有返回空列表,不报错建议使用
21         print(xp[0])               # 获取第一个,结果是Selecter对象。如果没有返回None不建议使用
22 
23         next = xp.extract_first()
24         # self.logger.warning(next)
25         if next is not None:
26             # scrapy.Request(路由, callback=self.parse回调函数回调自己)
27             yield scrapy.Request(next, callback=self.parse)
28         --------------------------- 分割 代码可直接运行,只是为了整理笔记-------------------------------
29         # 结合使用extract()
30         data = response.xpath('//*[@id="main"]/div/span/text()').extract()
31         for item in data:
32             self.logger.error(item)
 1 # 爬虫文件
 2 # -*- coding: utf-8 -*-
 3 import scrapy
 4 
 5 class JokeSpider(scrapy.Spider):
 6     name = 'joke'
 7     allowed_domains = ['xiaohua.zol.com.cn']
 8     start_urls = ['http://xiaohua.zol.com.cn/new/']
 9 
10     def parse(self, response):
11         joke_list = response.xpath('/html/body/div/div/ul/li')
12         for joke in joke_list:
13             joke_title = joke.xpath('./span[@class="article-title"]/a/text()').extract_first()
14             print(joke_title)
15            
16         page_next = response.xpath('//a[@class="page-next"]/@href').extract_first()
17         print(page_next)
18         if page_next:
19             """
20                 结果:page_next = "/new/2.html"
21                 要求:page_next = "http://xiaohua.zol.com.cn/new/2.html"
22                 response.urljoin进行路径拼接
23             """
24             page_next = response.urljoin(page_next) 
25             yield scrapy.Request(page_next, callback=self.parse)
joke.py 

遗漏补充:

 logging组成:

  在所有的编程中都存在的,用来打印日志。作用:问题追踪、数据分析  

  • 组成

    • logger、

    • handler、处理器对象

    • formatter、格式化对象

    • filter、过滤器

    • LogRecord、日志对象
  • 级别

    • debug:   调试

    • info:      info信息

    • warning:警告提示

    • error:    错误提示[编写的代码运行错误]

    • critical: 严重错误提示[编写的代码引起框架或系统错误]

 

posted @ 2019-04-26 19:58  Tom's  阅读(260)  评论(0编辑  收藏  举报