scrapy数据流程

  • 调度器—》request—》引擎—》下载中间件—》下载器
  • 下载器发送请求,获取resposne,—》response—>下载中间件—》引擎—》爬虫中间件—》spider
  • spider 提取数据—》引擎—》pipeline
  • spider 提取url地址–》构造request—》爬虫中间件—》引擎—》调度器

scrapy的使用流程

  • 创建项目
    • scrapy startproject mySpider
      • 示例:
        • scrapy startproject spider_project
  • 生成一个爬虫

    • scrapy genspider 爬虫名 要爬的网址(不带http) 一般都是主网址
      • 示例:
        • cd spider_project/
        • scrapy genspider xiaohua www.xiaohuar.com
    • 带分页的创建方法
      • scrapy genspider -t crawl tencent hr.tencent.com
    • 程序启动方法
      • scrapy crawl yangguang
  • 提取数据

    • 完善爬虫

      • start_url,response –> parse
      • 数据yield 通过传递给管道
      • 能够yield 的数据类型,dict,request,Item,None
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      resp = response.xpath('//div[@class="item masonry_brick"]')
      for i in resp:
      item = XiaohuaItem()
      item['name'] = i.xpath('.//span[@class="price"]/text()').extract_first()
      item['title'] = i.xpath('.//span/a/text()').extract_first()
      item['num'] = i.xpath('.//em[@class="bold"]/text()').extract_first()
      img_url = i.xpath('.//a/img/@src').extract_first()
      if not img_url.startswith('https'):
      img_url = 'http://www.xiaohuar.com/'+img_url
      item['img_url'] = img_url
      # print(data)
      yield item
  • 设置user_agent

    • `USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36 Qiyu/2.1.1.1’
  • 管道

    • 开启管道
      • 开启管道,键:位置,值:距离引擎的远近,越小越近,说句越先经过
      • 打开item_pipelines
      • 1
        2
           'spider_project.pipelines.SpiderProjectPipeline': 300,
        }
  • 进入items,设置字段名

    1
    2
    3
    4
    5
    6
    class XiaohuaItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    title = scrapy.Field()
    num = scrapy.Field()
    img_url = scrapy.Field()
  • 进入pipelines,存储数据到mongodb

    • 创建数据库连接
      • client = pymongo.MongoClient()
      • client = client['1807b']['xiaohua']
    • 简写

      • client = pymongo.MongoClient()['1807b']['xiaohua']
    • 入库

      1
      2
      3
      4
      class SpiderProjectPipeline(object):
      def process_item(self, item, spider):
      client.insert(dict(item))
      return item

scrapy如何发送请求,能够携带什么参数

  • scrapy.Request(url,callback,meta,dont_filter)
  • dont_filter=True 表示请求过的url地址还会继续被请求

scrapy如何把数据从一个解析函数传递到另一个,为什么需要这样做

  • meta是个字典类型,meta = {“item”:item}
  • response.meta[“item”]

scrapy中Item是什么,如何使用

  • Item 类,继承自scarpy.Item,name=scrapy.Field()
  • Item 定义那些字段我们需要抓取
  • 使用和字典一样
  • 在mongodb中插入数据的时候 dict(item)

pipeline中open_spider和close_spider是什么

  • open_spdier 爬虫开启执行一次,只有一次
  • close_spider 爬虫关闭的时候执行一次,只有一次