Scrapy框架基础

Scrapy

  • 概念:是一个爬虫框架,提取结构性的数据。其可以应用在数据挖掘,信息处理等方面。提供了许多的爬虫的基类,帮我们更简便使用爬虫。基于Twisted

安装

  • 首先安装依赖库Twisted
    pip install (依赖库的路径)
    依赖库:lxml,twisted
    pip install lxml

在线安装twisted:
pip install twisted
pip install -i https://pypi.tuna.tsinghua.edu/sample twisted
镜像:https://pypi.tuna.tsinghua.edu/simple xxx
http://mirrors.aliyun.com/pypi/simple xxx
http://pypi.douban.com/simple xxx
离线安装twisted:
首先在http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted这个网址下找到和你的python对应的twisted下载离线安装包
pip install 离线安装包的路径

安装:scrapy
pip install scrapy

测试是否安装成功:
终端下输入:scrapy如果不报错并且显示scrapy的版本信息则安装成功

【注意】路径名不能有中文,不能用管理员进入cmd,电脑系统用户路径不能是中文

scrapy工作原理

在这里插入图片描述

使用scrapy

工程创建与工程的结构
  • 命令:scrapy startproject 工程名
    工程目录结构:
2)项目目录结构
		firstSpider
			firstSpider
				spiders           爬虫目录(写代码位置)
					__init__.py
					myspider.py       爬虫文件,以后的爬虫代码写在这里
				__init__.py
				items.py          	  定义数据结构地方
				middlewares.py    中间件(了解)
				pipelines.py      管道文件
				settings.py       项目配置文件
			scrapy.cfg
  • spiders文件夹:定义爬虫文件(通过命令创建爬虫)

  • items文件:数据模型,用于将待爬虫的数据进行模型化(我们在爬取一个页面之前首先要在items文件中定义出我们要爬取的那些页面的元素)

  • middlewares文件:中间件,处理请求与响应等过程中的一些事务,scrapy中有两种中间件,即下载中间件和爬虫中间件。

  • pipelines文件:管道文件,处理解析以后的数据。

  • settings文件:配置文件,主要用于设置爬虫的相关配置(比如:用户代理、robots协议等)

  • 创建爬虫:
    指令:scrapy genspider [-t 爬虫模板] 爬虫名 域名

scrapy的架构与组成模块
  • 核心部分:引擎、调度器、下载器三大部件;这些部分的代码不在项目工程中体现,这些代码在scrapy的安装目录下。
    • 引擎:协调各个部件之间的工作,并且驱动整个系统
    • 调度器:用于接收引擎的调度,把引擎调度过来的url取出放入到调度队列中进行调度
    • 下载器:由调度器来调度下载器进行异步请求
  • 自定义部分:爬虫、管道两大部件。
    • 爬虫:是spider中的一个类,有大功能,即给引擎提供起始url,对下载器下载下来的数据进行解析。
    • 管道:爬虫解析完数据以后会把数据传给管道,管道对数据进行后期的处理(例如:存储等操作)
  • 其他组件(主要用于扩展爬虫的功能)
    中间件、items、用户代理等
运行爬虫

提示:windows用户安装一个插件:pip install pywin32
运行指令:运行爬虫 scrapy crawl 爬虫名 [-o xx.json/xml/csv]
例如: scrapy crawl qiubai -o qiubai.json
scrapy crawl qiubai -o qiubai.xml
scrapy crawl qiubai -o qiubai.csv

组建的使用

管道组件:首先要在settings文件将管道开启
ITEM_PIPELINES = {
‘MyfirstPro.pipelines.MyfirstproPipeline’: 300,
}

Scrapy运行的原理(即scrapy的执行流程)

  • 1)键入scrapy crawl xxx, 用爬虫xxx来驱动引擎开始工作
  • 2)引擎驱动起来首先加载scrapy依赖程序(比如:lxml、twisted等),加载完依赖程序以后,?引擎就可以正常工作
  • 3)引擎加载setting文件,从中读取当前工程的配置信息,根据配置信息去安排后面的工作
  • 4)引擎加载扩展程序,我们不需要修改,主要对引擎的功能进行扩展
  • 5)引擎加载下载中间件
  • 6)引擎加载爬虫中间件
  • 7)引擎加载管道的一些列组件
  • 8)(说明:以上7个步骤都是准备阶段,当准备工作完了,就可以正常运行)引擎根据键入的xxx这个爬虫的名字,来找到对应的类并且将该类实例化,把工程中所有引入的中间件和管道组件类都实例化
  • 9)引擎会从实例化的xxx这个爬虫对象的start_urls中提取出起始url,并且检验是否在allowed_domains里面,如果在则将这些url加入到调度器的调度队列中。
  • 10)调度器对调度队列的url进行出队,然后创建若干个异步的高性能的下载器对象来下载url(注意:如果调度队列url的数量多于最大并发量,则多出的那些url等待)
  • 11)下载器将url请求(请求的过程会讲过若干层的下载中间件的过滤),并且获得响应,然后将响应的数据通过回调函数传递给爬虫对象
  • 12)爬虫对象对传递过来的响应数据进行解析,并且将解析的数据封装到一个可迭代的容器中,返回给引擎。
  • 13)如果管道已经开启,引擎会根据管道的优先级顺将爬虫返回过来的数据依次传递给各个管道
  • 14)管道对响应数据进行最后的处理,处理结束以后数据在返回给引擎由引擎来销毁
  • 15)关闭爬虫、中间件和管道然后关闭引擎,并且输出这次爬虫的一些请求与响应以及调度等信息。

主要代码

#spider里爬虫

# -*- coding: utf-8 -*-
import scrapy
class QiubaiSpider(scrapy.Spider):
    # 这个是爬虫类,是scrapy.Spider的子类,即是一个基础爬虫类

    # 第一块:name、allowed_domains、start_urls等属性
    name = 'qiubai' # name属性是爬虫的名字,这个属性是爬虫在当前工程中的唯一标识,我们在启动引擎的时候需要将爬虫的名字带入到启动命令,告诉引擎,当前是哪个驱动的引擎,引擎就会给对应的爬虫类创建实例对象

    allowed_domains = ['qiushibaike.com'] # 允许访问的那些域名,用于限制爬虫的爬取范围,一旦域名不合法,就不允许爬

    start_urls = ['https://www.qiushibaike.com/text/page/1/']
    # 当引擎驱动起来以后首先会给当前爬虫类创建出一个实例对象,然后从这个成员变量中取出start_urls,把这些url先从allowed_domains里面过滤一遍,然后把符合的url加入到调度器的调度队列中去

    # 第二块:parse函数
    def parse(self, response):
        # 这个方法是一个回调,下载器下载完成数据以后会回调这个函数,把下载下来的响应内容传递给response
        print("我们获得的响应对象为:",response)
        # 解析响应体
        # 【注意】scrapy自带xpath和css两种解析方法
        qiu_list = response.xpath("//div[starts-with(@id,'qiushi_tag')]")
        for qiu in qiu_list:
            item = {}
            item["conent"] = "".join(qiu.xpath(".//div[@class='content']//text()").extract())
            # scrapy自带的xpath解析出来的内容是一系列的selector对象,我们需要从这些selector对象中把内容取出来
            item["author"] = qiu.xpath(".//h2/text()").extract()[0]
            # print(item)

            yield item
            # parse函数最后要返回一个可迭代对象,这个返回值会被引擎继续接收,引擎一旦接收到这个可迭代对象,就会立即对该对象进行迭代


#管道组件代码

import redis

class MyfirstproPipeline(object):
    # 这个类是object的一个派生类,是一个普通类,但是我们把它引入了管道组件中,它就有具有的管道类的能力
    # 【注意】爬虫类和管道类的实例同时产生同时销毁

    # 一个管道类实例的生命周期
    def open_spider(self,spider):
        # 这个函数,当前爬虫开启的时候被调用
        print("%s爬虫已经开启!"%spider)
        # 创建redis链接
        self.rds = redis.StrictRedis(host="redis主机名",port=6379,db=9)

    def process_item(self, item, spider):
        # 这个方法,在引擎迭代的过程中不断的被调用,并且把当前迭代的数据传递给item
        print("当前爬虫%s正在迭代数据:%s"%(spider,item))
        self.rds.lpush("qiubai",item)

        return item # 我们处理完一个数据以后一定把这个数据重新返回给引擎,由引擎来处理
        # 【注意】如果这里不返回,每一次迭代的item在这里就会被销毁,引擎就那不到这个数据,后面的管道也无法使用该数据

    def close_spider(self,spider):
        print("爬虫%s被关闭!"%spider)
		


#配置文件settings
ITEM_PIPELINES = {
    # 组件名ITEM_PIPELINES,这个组件是一个多值组件,它的值用一个字典来表示
 'MyfirstPro.pipelines.MyfirstproPipeline': 300,}
 # 每个键值对都是一个管道,键代表当前管道的位置(这个位置可以是工程文件的位置,也可以是scrapy系统的位置),值代表当前管道的优先级,这个值越小优先级越大;爬虫返回到引擎中的数据会根据优先级的顺序依次的进入各个管道
#用户代理
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
#robots文件检测
ROBOTSTXT_OBEY = False






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值