零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

嘿~大家好,我是小编4U:

作为一个爬虫的老手了,不知道大家有没有一种感觉:要写出一个完整的爬虫程序需要做很多琐碎的工作。比如,要针对不同的网站制定不同的解析方式;要导入不同功能的模块;还要编写各种爬取流程的代码。我们在日常工作中会使用PPT模板来制作PPT。那么有没有一个现成的爬虫模板,让我们能够改之即用,也就是说对这个模板进行适当的修改,就能完成一个爬虫项目的开发呢?

那就让我们来一起学习一下Scrapy这个nb的框架

(只要认真学,绝对能拿下)

零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

什么是Scrapy

在学习python的过程中,我们用到了许多的模块,他们有不同的功能,比如:

  • 1. requests模块:进行请求
  • 2. csv模块:储存数据
  • 而在Scrapy框架里面,我们不需要做怎么多,因为在这个框架里面都能自动实现,下面,我们就来了解Scrapy的基础知识,包括Scrapy的结构及其工作原理;

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    上面的这张图是Scrapy的整个结构。你可以把整个Scrapy框架当成是你所在的部门。最中心位置的Scrapy Engine(引擎)就是你所在部门的大boss,负责统筹规划你这个部门的四大职能。

  • Scheduler(调度器) 主要负责处理引擎发送过来的requests对象(即网页请求的相关信息集合,包括params,data,cookies,request headers…等),会把请求的url以有序的方式排列成队,并等待引擎来提取(功能上类似于gevent库的queue模块)。
  • Downloader(下载器) 则是负责处理引擎发送过来的requests,进行网页爬取,并将返回的response(爬取到的内容)交给引擎。它对应的是爬虫流程【获取数据】这一步。
  • Spiders(爬虫) 主要任务是创建requests对象和接受引擎发送过来的response(Downloader部门爬取到的内容),从中解析并提取出有用的数据。它对应的是爬虫流程【解析数据】和【提取数据】这两步。
  • Item Pipeline(数据管道) 负责存储和处理Spiders提取到的有用数据。这个对应的是爬虫流程【存储数据】这一步。
  • Downloader Middlewares(下载中间件) 它的工作相当于下载器的助手,比如会提前对引擎发送的诸多requests做出处理。
  • Spider Middlewares(爬虫中间件) 它的工作则相当于爬虫的助手,比如会提前接收并处理引擎发送来的response,过滤掉一些重复无用的东西。
  • 零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    Scrapy的工作原理

    在Scrapy爬虫部门里,每个成员都各司其职,互相配合,这套运行流程的逻辑很简单,其实就是:引擎大boss说的话就是最高需求!看下面的对话:

  • ScrapyEngine: 伙计们,今天咱们要爬什么呢?
  • Spiders: 爬取一个url:htpps://…,我已经分装成requests了
  • ScrapyEngine: 调度器,配合Spiders的工作。把requests都放进队列
  • 调度器: 收到!
  • ScrapyEngine: 下载器,把这些requests爬下来,爬取结果发给我
  • 下载器: 下载器:收到,现在开始处理
  • 下载器: 已完成,现在把response发给你。
  • ScrapyEngine: Spiders, 我已经把response发给你,请尽快解析和处理
  • Spiders: 收到。已完成,提取出来的Item已经发送给你了。
  • ScrapyEngine: 数据管道,把Spider这些Otem处理一下。
  • 数据管道: 收到,现在开始处理。
  • 从上面的对话可以看出Scrapy框架的工作原理。也有许多的优势和好处:

  • 在使用 Scrapy 的时候。我们不需要去关心爬虫的每个流程。
  • 并且Scrapy中的网络请求都是默认异步模式,请求和返回都会由引擎去自动分配处理。
  • 如果某个请求出现异常,框架也会帮我们做异常处理,跳过这个异常的请求,继续去执行后面的程序。
  • 所以说,我们使用 Scrapy 可以省掉很多的时间和工作
  • 零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    Scrapy的用法

    初学的小伙伴在没搞懂原理之前,先别急着看下面的内容,试着把原理搞懂再来做项目。

    我们在了解完Scrapy的结构和工作原理后,我们就来试着爬一爬——豆瓣Top250的图书。

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    01

    明确目标:

    先来查看一下即将要爬取的网址 :
    https://book.douban.com/top250

    豆瓣Top250图书一共有10页,每页有25本书籍。我们的初步目标是:先只爬取前三页书籍的信息,总共是 25 x 3 = 75 本,包含书名、出版信息、书籍评分。

    02

    分析目标:

    接下来就是要分析爬取网站的网页结构, 首先得判断这些信息被存在了哪里,为了防止出错,大家最好跟着操作,按F12打开快乐爬虫模式,点开Network

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

  • 刷新页面,然后点击第0个请求top250,看Response.
  • 我们能在里面找到书名、出版信息,说明我们想要的书籍信息就藏在这个网址的HTML里。
  • 我们能在里面找到书名、出版信息,说明我们想要的书籍信息就藏在这个网址的HTML里。
  • 零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

  • 接着,我们就来具体观察一下这个网站,因为它是带分页的。
  • 所以点击翻到豆瓣Top250图书的第2页。
  • https://book.douban.com/top250?start=25
  • 零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

  • 我们可以看到,网址发生了变化,后面多了 ?start=25。现在的你,应该就能猜到后面的数字应该是代表一页的25本书籍吧?我们还可以看一下第三页,来验证一下
  • 零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    事实证明,我们猜对了。每翻一页,网址后面的数字都会增加25,说明这个start的参数就是代表每页的25本书籍。

    也就是表达只要改变 ?start=后面的数字(翻一页加25),我们就能得到每一页的网址。

    网页我们已经得到,接下来就是如何去得到所要爬取的内容了

    还是是右击打开“检查”工具,点击 Elements,再点击光标,把鼠标依次移到书名、出版信息、评分处,就能在HTML里找到这些书籍信息。如下图,《红楼梦》的书籍信息就全部放在 table width=”100%”标签里

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    但是问题出现了:

  • 其实每一页的25本书籍信息都分别藏在了一个 table width=”100%”标签里。不过这个标签没有 class属性也没有id属性,不方便我们提取信息。
  • 那怎么办呢?我们得继续再找一个既方便我们提取,又能包含所有书籍信息的标签。
  • 我们可以看看 table width=”100%”标签下的 tr class=”item”元素,好像刚好都能满足我们的要求,既有 class属性,又包含了书籍的信息。
  • 零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    最后来总结一下:

    我们只要取出 <tr class=”item”> 元素下 <a> 元素的title属性的值、<p class=”pl”>元素,<span class=”rating_nums”>元素,就能得到书名、出版信息和评分的数据。

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    03

    代码实现

    接下来会涉及到很多Scrapy的用法,如果想学会的话,请你一定要认真地看!

    (1).Scrapy的安装和文件生成

    使用 conda 安装 Scrapy,运行:

    conda install -c conda-forge scrapy

    或者,可以从pypi安装scrappy及其依赖项

    pip install Scrapy

    安装完成后,要在本地电脑打开一个你要保存的文件

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    再框内输入cmd,然后回车

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    就能跳转到对于文件的终端;

    然后,再输入一行能帮我们创建Scrapy项目的命令:

    scrapy startproject douban,douban 就是Scrapy项目的名字。回车,一个Scrapy项目就创建成功了,只要一步一步来,肯定不会出错的

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    下载完成后,可以看到有这些文件

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    Scrapy项目里每个文件都有它对应的具体功能。例如:

  • settings.py 是scrapy里的各种设置、
  • items.py 是用来定义数据的、
  • pipelines.py 是用来处理数据的,
  • 它们对应的就是Scrapy的结构中的Item Pipeline(数据管道)。

    其中最重要的是spiders是放置爬虫的目录。我们可以在spiders这个文件夹里创建爬虫文件。我们来把这个文件,命名为Book_douban_Top250。后面的大部分代码都需要在这个Book_douban_Top250.py文件里编写。

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    (2).Scrapy核心代码

    注意!前方高能部分了,请系好安全带!勿跟丢了!

    导入BeautifulSoup用于解析和提取数据; 导入scrapy是待会我们要用创建类的方式写这个爬虫,我们所创建的类将直接继承scrapy中的scrapy.Spider类。这样,有许多好用属性和方法,就能够直接使用。

    零基础教学,用python爬虫框架“Scrapy”来解锁一个小成就

    接着我们开始编写爬虫的核心代码。

    在Scrapy中,每个爬虫的代码结构基本都如下所示:

  • import scrapy
  • import bs4
  • class DoubanSpider(scrapy.Spider):
  • # 定义一个爬虫类DoubanSpider
  • name = ‘book_douban’
  • # name是定义爬虫的名字,这个名字是爬虫的唯一标识。
  • # name = ‘book_douban’意思是定义爬虫的名字为book_douban。
  • # 等会我们启动爬虫的时候,要用到这个名字。
  • allowed_domains = [‘book.douban.com’]
  • # allowed_domains是定义允许爬虫爬取的网址域名(不需要加https://)。
  • # 如果网址的域名不在这个列表里,就会被过滤掉。
  • start_urls = [‘https://book.douban.com/top250?start=0’]
  • # start_urls是定义起始网址,就是爬虫从哪个网址开始抓取。
  • # 并且allowed_domains的设定对start_urls里的网址不会有影响。
  • def parse(self, response):
  • # parse是Scrapy里默认处理response的一个方法。
  • print(response.text)
  • 是不是觉得和之前自己动手写爬虫的完全不一样了呢?怎么连

    requests.get()

    都没有了呢?其实在框架里,我们并不需要写这一句。scrapy框架会为我们做这件事,写好请求后,接下来你就可以直接写对 response

    如何做处理,我会在后面做出示例。

    在上面我们已经找到了网站的规律,我们直接用for循环得到每个网址:


    https://book.douban.com/top250?start=(页数-1)*25 ,代码如下:

  • for x in range(3):
  • # 获取网址,添加到start_urls
  • url = f’https://book.douban.com/top250?start={x * 25}’
  • start_urls.append(url)
  • 我们只先爬取豆瓣Top250前3页的书籍信息,接下来,只要再借助DoubanSpider(scrapy.Spider)中的 parse 方法处理 response,借助 BeautifulSoup 来取出我们想要的书籍信息的数据。Let`s go

  • def parse(self, response):
  • #parse是默认处理response的方法。
  • bs = bs4.BeautifulSoup(response.text,’html.parser’)
  • #用BeautifulSoup解析response。来源:乐搏软件测试

    声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

  • 上一篇 2021年7月27日
    下一篇 2021年7月27日

    相关推荐