zoukankan      html  css  js  c++  java
  • Python爬虫_scrapy框架

    scrapy框架

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可

    环境安装

    linux: pip3 install scrapy

    windows:

    1. pip3 install wheel
    
    2. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
    
    3. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
    
    4. pip3 install pywin32
    
    5. pip3 install scrapy
    安装步骤

    基本使用

    1.创建项目:scrapy startproject 项目名称

    project_name/
       scrapy.cfg:
       project_name/
           __init__.py
           items.py
           pipelines.py
           settings.py
           spiders/
               __init__.py
    
    scrapy.cfg   项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
    items.py     设置数据存储模板,用于结构化数据,如:Django的Model
    pipelines    数据持久化处理
    settings.py  配置文件,如:递归的层数、并发数,延迟下载等
    spiders      爬虫目录,如:创建文件,编写爬虫解析规则
    项目结构

    2.创建爬虫应用程序:

          cd project_name(进入项目目录)

          scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider qiubai www.qiushibaike.com)

    3.编写爬虫文件:在步骤2执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件,文件源码如下:

    # -*- coding: utf-8 -*-
    import scrapy
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai' #应用名称
        #允许爬取的域名(如果遇到非该域名的url则爬取不到数据)
        allowed_domains = ['https://www.qiushibaike.com/']
        #起始爬取的url
        start_urls = ['https://www.qiushibaike.com/']
    
         #访问起始URL并获取结果后的回调函数,该函数的response参数就是向起始的url发送请求后,获取的响应对象.该函数返回值必须为可迭代对象或者NUll 
         def parse(self, response):
            print(response.text) #获取字符串类型的响应内容
            print(response.body)#获取字节类型的相应内容
    源码

    4.设置修改settings.py配置文件相关配置:

    修改内容及其结果如下:
    19行:USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' #伪装请求载体身份
    
    22行:ROBOTSTXT_OBEY = False  #可以忽略或者不遵守robots协议

    5.执行爬虫程序:scrapy crawl  应用名称

    # -*- coding: utf-8 -*-
    import scrapy
    
    class QiubaiSpider(scrapy.Spider):
        name = 'qiubai'
        allowed_domains = ['https://www.qiushibaike.com/']
        start_urls = ['https://www.qiushibaike.com/']
    
        def parse(self, response):
            #xpath为response中的方法,可以将xpath表达式直接作用于该函数中
            odiv = response.xpath('//div[@id="content-left"]/div')
            content_list = [] #用于存储解析到的数据
            for div in odiv:
                #xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。
                author = div.xpath('.//div[@class="author clearfix"]/a/h2/text()')[0].extract()
                content=div.xpath('.//div[@class="content"]/span/text()')[0].extract()
    
                #将解析到的内容封装到字典中
                dic={
                    '作者':author,
                    '内容':content
                }
                #将数据存储到content_list这个列表中
                content_list.append(dic)
    
            return content_list
    实例

     持久化存储

    基于终端指令的持久化存储

    保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作。

    执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储
    scrapy crawl 爬虫名称 -o xxx.json
    scrapy crawl 爬虫名称 -o xxx.xml
    scrapy crawl 爬虫名称 -o xxx.csv

    基于管道的持久化存储

    scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。要想使用scrapy的持久化操作功能,我们首先来认识如下两个文件:

    items.py:数据结构模板文件。定义数据属性。
    
    pipelines.py:管道文件。接收数据(items),进行持久化操作

    持久化流程

    1.爬虫文件爬取到数据后,需要将数据封装到items对象中。
    
    2.使用yield关键字将items对象提交给pipelines管道进行持久化操作。
    
    3.在管道文件中的process_item方法中接收爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象中存储的数据进行持久化存储
    
    4.settings.py配置文件中开启管道

     实例(对糗事百科首页中的段子和作者数据进行爬取,然后进行持久化存储)

    爬虫文件:qiubaiDemo.py

    # -*- coding: utf-8 -*-
    import scrapy
    from secondblood.items import SecondbloodItem
    
    class QiubaidemoSpider(scrapy.Spider):
        name = 'qiubaiDemo'
        allowed_domains = ['www.qiushibaike.com']
        start_urls = ['http://www.qiushibaike.com/']
    
        def parse(self, response):
            odiv = response.xpath('//div[@id="content-left"]/div')
            for div in odiv:
                # xpath函数返回的为列表,列表中存放的数据为Selector类型的数据。我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。
                author = div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first()
                author = author.strip('
    ')#过滤空行
                content = div.xpath('.//div[@class="content"]/span/text()').extract_first()
                content = content.strip('
    ')#过滤空行
    
                #将解析到的数据封装至items对象中
                item = SecondbloodItem()
                item['author'] = author
                item['content'] = content
    
                yield item#提交item到管道文件(pipelines.py)
    爬虫文件:qiubaiDemo.py

    items文件:items.py

    import scrapy
    
    class SecondbloodItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        author = scrapy.Field() #存储作者
        content = scrapy.Field() #存储段子内容
    items文件:items.py

     管道文件:pipelines.py

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    
    class SecondbloodPipeline(object):
        #构造方法
        def __init__(self):
            self.fp = None  #定义一个文件描述符属性
      #下列都是在重写父类的方法:
        #开始爬虫时,执行一次
        def open_spider(self,spider):
            print('爬虫开始')
            self.fp = open('./data.txt', 'w')
    
       #因为该方法会被执行调用多次,所以文件的开启和关闭操作写在了另外两个只会各自执行一次的方法中。
        def process_item(self, item, spider):
            #将爬虫程序提交的item进行持久化存储
            self.fp.write(item['author'] + ':' + item['content'] + '
    ')
            return item
    
        #结束爬虫时,执行一次
        def close_spider(self,spider):
            self.fp.close()
            print('爬虫结束')
    管道文件:pipelines.py

     配置文件:settings.py

    #开启管道
    ITEM_PIPELINES = {
        'secondblood.pipelines.SecondbloodPipeline': 300, #300表示为优先级,值越小优先级越高
    }
    配置文件:settings.py

     基于mysql的管道存储

    只需将实例中得管道文件和配置文件修改即可

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    #导入数据库的类
    import pymysql
    class QiubaiproPipelineByMysql(object):
    
        conn = None  #mysql的连接对象声明
        cursor = None#mysql游标对象声明
        def open_spider(self,spider):
            print('开始爬虫')
            #链接数据库
            self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',password='123456',db='qiubai')
        #编写向数据库中存储数据的相关代码
        def process_item(self, item, spider):
            #1.链接数据库
            #2.执行sql语句
            sql = 'insert into qiubai values("%s","%s")'%(item['author'],item['content'])
            self.cursor = self.conn.cursor()
            #执行事务
            try:
                self.cursor.execute(sql)
                self.conn.commit()
            except Exception as e:
                print(e)
                self.conn.rollback()
    
            return item
        def close_spider(self,spider):
            print('爬虫结束')
            self.cursor.close()
            self.conn.close()
    pipelines.py文件
    ITEM_PIPELINES = {
        'qiubaiPro.pipelines.QiubaiproPipelineByMysql': 300,
    }
    settings.py

    基于redis的管道存储

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    import redis
    
    class QiubaiproPipelineByRedis(object):
        conn = None
        def open_spider(self,spider):
            print('开始爬虫')
            #创建链接对象
            self.conn = redis.Redis(host='127.0.0.1',port=6379)
        def process_item(self, item, spider):
            dict = {
                'author':item['author'],
                'content':item['content']
            }
            #写入redis中
            self.conn.lpush('data', dict)
            return item
    pipelines.py
    ITEM_PIPELINES = {
        'qiubaiPro.pipelines.QiubaiproPipelineByRedis': 300,
    }
    settings.py

      

     

  • 相关阅读:
    项目风险软考之软工基础知识(1)
    序列输出ZOJ1108 FatMouse's Speed
    电平波特率UART自适应波特率的设置方法
    nullnull2013金山西山居创意游戏程序挑战赛——初赛(3)生日猜猜猜
    删除监听oracle单库彻底删除干净的方法
    类关闭由一个activity启动第二个activity
    代码文件android:向手机卡上写入文件时总是不成功,解决办法
    功能应用程序延迟发送:4款定时发送短信的应用程序
    监听事件android activity中键盘的监听
    nullnull爆笑百家讲坛之十大逆袭情侣.
  • 原文地址:https://www.cnblogs.com/z1115230598/p/10987159.html
Copyright © 2011-2022 走看看