Scrapy 基础

366 阅读4分钟

Scrapy 基础

一个简单爬虫 Scrapy是Python中为了爬去网页数据而提供的框架,主要应用于:数据挖掘,信息处理或存储历史数据等一系列的程序中。那么我们爬数据的的本质是什么呢?就是利用Http、Https协议将开放性的web内容下载到本地中。 当然既然有爬虫就会有所谓的反爬,反反爬,反反爬。。。各种防范措施,但是程序员是不会放弃的。

Scrapy是什么?

  • 1.Scrapy是蜘蛛爬虫框架,我们用蜘蛛来获取互联网上的各种信息,然后再对这些信息进行数据分析处理。

  • 2.Scrapy的组成

    • 引擎:处理整个系统的数据流处理,出发事务
    • 调度器: 接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回
    • 下载器: 下载网页内容,并将网页内容返回给蜘蛛
    • 蜘蛛: 蜘蛛是主要干活的,用来制定特定域名或网页的解析规则
    • 项目管道: 清洗验证存储数据,页面被蜘蛛解析后,被发送到项目管道,并经过几个特定的次序处理数据。
    • 下载器中间件: 位于引擎和下载器之间,处理引擎与下载器之间的请求及响应
    • 蜘蛛中间件:位于引擎和蜘蛛之间,处理从引擎发送到调度的请求及响应

    整体架构图

  • 3.工作机制

    • 爬取流程
      • 首先从URL开始,Scheduler会将其交给Downloader进行下载,下载之后会交给Spider进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回给Scheduler;另一种是需要保存的数据,他们被送到Item Pipeline那里,那是对数据进行后期处理(详细分析,过滤,存储)的地方。另外在数据流动的管道里还可以安装各种中间件,进行必要的处理。
    • 数据流程
      • 1.引擎打开一个网站,找到处理该网站的Spider,并向Spider请求第一个要爬取的URL。
      • 2.引擎从Spider中获取到第一个要爬取的URL并在调度器中以request进行调度。
      • 3.引擎向调度器请求下一个要爬取的URL
      • 4.调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件转发给下载器
      • 5.下载完毕后,下载器生成一个该页面的response,并将其通过中间件返回给引擎
      • 6.引擎从下载器中接收到response并通过Spider中间件发送给Spider处理
      • 7.Spider处理response并返回爬取到的Item及新的Request给引擎。
      • 8.引擎将爬取到的Item给Item Pipeline,将Request给调度器
      • 9.从第二步重复,直到调度器中没有更多的request,引擎关闭该网站。

爬取豆瓣电影

新建Scrapy项目

scrapy startproject douban

新建spider文件

scrapy genspider douban_spider movie.douban.com

Scrapy 抓取四步走

  • 新建项目
  • 明确目标
  • 制作爬虫
  • 存储内容

明确目标

item.py 文件

    # 序号
    serial_number = scrapy.Field()
    # 电影的名称
    movie_name = scrapy.Field()
    # 电影的介绍
    introduce = scrapy.Field()
    # 星级
    star = scrapy.Field()
    # 电影的评论数
    evaluate = scrapy.Field()
    # 电影的描述
    describe = scrapy.Field()

爬虫文件(spider)的编写

douban_spider.py

我们的引擎会向我们的spider要一个入口url。之后,我们的引擎会将入口url扔到调度器里面。我们调度器拿到入口url进行调度之后,调度器又会把这个url扔给我们的引擎。高大上的引擎不会干这活,它又把url扔给我们的下载器,扔给下载器之后进行数据的解析和下载。下载完之后会返回到我们的spider文件里面来,然后parse方法进行解析

    # 爬虫名,和项目名称不能重复
    name = 'douban_spider'
    # 要抓取的域名
    allowed_domains = ['movie.douban.com']
    # 入口url
    # start_urls = ['http://movie.douban.com/']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        print(response.text)

运行项目 scrapy crawl douban_spider

此时会报错 DEBUG: Crawled (403)

此时要设置User-Agent

setting.py

#USER_AGENT = 'douban (+http://www.yourdomain.com)'  要修改

设置一个启动文件

main.py

# 先导入一个包
from scrapy import cmdline

# 在cmdline里面,去执行一些命令
cmdline.execute("scrapy crawl douban_spider".split())  # 进行一个字符串的处理

编写我们的解析文件

在这里面如何进行解析呢?我们主要用到的技术就是xpath,通过xpath,来解析我们目标页面里面的HTML节点。

douban_spider 文件 解析代码

movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        for i_item in movie_list:
            print(i_item)

进一步的解析

# 引入我们之前定义好的item
from douban.items import DoubanItem