ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

scrapy框架的简介与使用

2022-03-10 13:02:12  阅读:224  来源: 互联网

标签:框架 url 简介 self 爬虫 Spider item scrapy tag


Scrapy框架

    • crapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

    • Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

    • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

    • Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

    • Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

    • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

    • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)


          •  

 

Scrapy框架的使用

  • 创建一个scrapy项目
    • scrapy startproject  项目名
    • scrapy genspider  爬虫名 域名

  • 运行爬虫项目
    • scrapy crawl  爬虫名
    • 创建完爬虫项目后会自动生成以下代码
    •  

      import scrapy
      
      
      class TestSpider(scrapy.Spider):
          # 爬虫名称
          name = 'test'
          # 设置允许爬取的域(可以指定多个)
          allowed_domains = ['baidu.com']
          # 设置起始url(设置多个)
          start_urls = ['http://baidu.com/']
      
          def parse(self, response):
              '''
              是一个回调方法,起始url请求成功后,会回调这个方法
              :param response: 响应结果
              :return:
              '''
              pass

       

  • 在parse中自定义解析方式
    •     def parse(self, response):
              '''
              在parse回调方法中
              step1;提取目标数据
              step2;获取新的url
              :param response: 请求的响应结果
              :return:
              '''
              print(response.status)
              #response.xpath(): 使用xpath语法,得到的是selectorlist对象
              # response.css(): 使用css选择器,得到的是selectorlist对象
              # extract(): 将selector 序列化为unicode字符串
              # step1;提取目标数据
              # 获取分类列表
              tags = response.xpath('//div[@class="Taright"]/a')
              # tags = response.css('.Taright a')
              for tag in tags:
                  # 实例化一个item,用来存储数据
                  tag_item = ChinazspidertagItem()
                  # 获取网站分类的名称
                  # tagname = tag.xpath('./text()')[0].extract()
                  tagname = tag.xpath('./text()').extract_first('')
                  tag_item['tagname'] = tagname
                  # 使用css取值(文本)
                  # tagname = tag.css('::text').extract_first('')
                  # 获取网站分类的首页url地址
                  # first_url = tag.xpath('./@href')[0].extract()
                  first_url = tag.xpath('./@href').extract_first('')
                  tag_item['firsturl'] = first_url
                  # css取值(属性)
                  # first_url = tag.css('::attr(href)').extract_first('')
                  print(tag_item)
                  # print(type(tagname),type(first_url))
                  # print(tagname,first_url)
                  # 将获取到的数据交给管道处理
                  yield tag_item
                  # http://top.chinaz.com/hangye/index_yule_yinyue.html
                  # http://top.chinaz.com/hangye/index_yule_yinyue_2.html
                  '''
                  url,设置需要发起请求的url地址
                  callback=None,设置请求成功后的回调方法
                  method='GET',请求方式,默认为get请求
                  headers=None,设置请求头,字典类型
                  cookies=None,设置cookies信息,模拟登录用户,字典类型
                  meta=None,传递参数(字典类型)
                  encoding='utf-8',设置编码
                  dont_filter=False, 是否去重,默认为false,表示去重
                  errback=None, 设置请求失败后的回调
                  '''
                  yield scrapy.Request(first_url,callback=self.parse_tags_page)

       

  • 关于yeild函数介绍
    • 简单地讲,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,带有yeild的函数遇到yeild的时候就返回一个迭代值,下次迭代时, 代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行, 直到再次遇到 yield。

    • 通俗的讲就是:在一个函数中,程序执行到yield语句的时候,程序暂停,返回yield后面表达式的值,在下一次调用的时候,从yield语句暂停的地方继续执行,如此循环,直到函数执行完。

     

    Item pipeline(管道文件)使用
    • 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。

 

  • 爬虫数据持久化
    • 将数据存入mysql数据库
    • ITEM_PIPELINES = {
      'douban.pipelines.DoubanPipeline': 300,
      }

      关于数据库的相关配置
      MYSQL_HOST = '127.0.0.1'
      MYSQL_PORT = 3306
      MYSQL_USER = ''
      MYSQL_PWD = ''
      MYSQL_DB = ''
      pipelines.py管道文件

    • 往数据库里插数据
      class ChinazspiderPipeline(object):
          def __init__(self):
              '''
              初始化方法
              '''
              # self.file = open('chinaz.json','a')
              # 创建数据库链接
              self.client = pymysql.Connect(
                  '127.0.0.1', 'root', 'czj1234',
                  'chinaz', 3306, charset='utf8'
              )
              # 创建游标
              self.cursor = self.client.cursor()
      
          def open_spider(self, spider):
              '''
              爬虫启动的时候回调用一次
              :param spider:
              :return:
              '''
              print('爬虫开启')
              pass
      
          def process_item(self, item, spider):
              '''
              这个方法必须实现,爬虫文件中所有的item 都会经过这个方法
              :param item: 爬虫文件传递过来的item对象
              :param spider: 爬虫文件实例化的对象
              :return:
              '''
              # 存储到本地json文件
              data_dict = dict(item)
              # import json
              # json_data = json.dumps(data_dict,ensure_ascii=False)
              # self.file.write(json_data+'\n')
              # 使用isisinstance判断item要存储的表
              # if isinstance(item,ChinazprojectWebInfoItem):
              #     print('网站信息')
              #     tablename = 'webinfo'
              # elif isinstance(item,ChinazspidertagItem):
              #     print('网站分类信息')
              #     tablename = 'tags'
              #     #
              # # 往数据库里写
              # sql = """
              #     insert into %s(%s)
              #     values (%s)
              # """ % (tablename,','.join(data_dict.keys()), ','.join(['%s'] * len(data_dict)))
              sql,data = item.get_insert_sql_data(data_dict)
      
              try:
                  self.cursor.execute(sql, list(data_dict.values()))
                  self.client.commit()
              except Exception as err:
                  self.client.rollback()
                  print(err)
              # 如果有多个管道文件,一定要return item , 否则下一管道无法接收到item
              print('经过了管道')
              return item
      
          def close_spider(self, spider):
              '''
              爬虫结束的时候调用一次
              :param spider:
              :return:
              '''
              # self.file.close()
              self.client.close()
              self.cursor.close()
              print('爬虫结束')

       

标签:框架,url,简介,self,爬虫,Spider,item,scrapy,tag
来源: https://www.cnblogs.com/feiyuyu/p/15988025.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有