嘿~大家好,我是小编4U:
作为一个爬虫的老手了,不知道大家有没有一种感觉:要写出一个完整的爬虫程序需要做很多琐碎的工作。比如,要针对不同的 站制定不同的解析方式;要导入不同功能的模块;还要编写各种爬取流程的代码。我们在日常工作中会使用PPT模板来制作PPT。那么有没有一个现成的爬虫模板,让我们能够改之即用,也就是说对这个模板进行适当的修改,就能完成一个爬虫项目的开发呢?
那就让我们来一起学习一下Scrapy这个nb的框架
(只要认真学,绝对能拿下)
一
什么是Scrapy
在学习python的过程中,我们用到了许多的模块,他们有不同的功能,比如:
而在Scrapy框架里面,我们不需要做怎么多,因为在这个框架里面都能自动实现,下面,我们就来了解Scrapy的基础知识,包括Scrapy的结构及其工作原理;
上面的这张图是Scrapy的整个结构。你可以把整个Scrapy框架当成是你所在的部门。最中心位置的Scrapy Engine(引擎)就是你所在部门的大boss,负责统筹规划你这个部门的四大职能。
二
Scrapy的工作原理
在Scrapy爬虫部门里,每个成员都各司其职,互相配合,这套运行流程的逻辑很简单,其实就是:引擎大boss说的话就是最高需求!看下面的对话:
从上面的对话可以看出Scrapy框架的工作原理。也有许多的优势和好处:
三
Scrapy的用法
初学的小伙伴在没搞懂原理之前,先别急着看下面的内容,试着把原理搞懂再来做项目。
我们在了解完Scrapy的结构和工作原理后,我们就来试着爬一爬——豆瓣Top250的图书。
01
明确目标:
先来查看一下即将要爬取的 址 :
https://book.douban.com/top250
豆瓣Top250图书一共有10页,每页有25本书籍。我们的初步目标是:先只爬取前三页书籍的信息,总共是 25 x 3 = 75 本,包含书名、出版信息、书籍评分。
02
分析目标:
接下来就是要分析爬取 站的 页结构, 首先得判断这些信息被存在了哪里,为了防止出错,大家最好跟着操作,按F12打开快乐爬虫模式,点开Network
事实证明,我们猜对了。每翻一页, 址后面的数字都会增加25,说明这个start的参数就是代表每页的25本书籍。
也就是表达只要改变 ?start=后面的数字(翻一页加25),我们就能得到每一页的 址。
页我们已经得到,接下来就是如何去得到所要爬取的内容了
还是是右击打开“检查”工具,点击 Elements,再点击光标,把鼠标依次移到书名、出版信息、评分处,就能在HTML里找到这些书籍信息。如下图,《红楼梦》的书籍信息就全部放在 table width=”100%”标签里
但是问题出现了:
最后来总结一下:
我们只要取出 <tr class=”item”> 元素下 <a> 元素的title属性的值、<p class=”pl”>元素,<span class=”rating_nums”>元素,就能得到书名、出版信息和评分的数据。
03
代码实现
接下来会涉及到很多Scrapy的用法,如果想学会的话,请你一定要认真地看!
(1).Scrapy的安装和文件生成
使用 conda 安装 Scrapy,运行:
conda install -c conda-forge scrapy
或者,可以从pypi安装scrappy及其依赖项
pip install Scrapy
安装完成后,要在本地电脑打开一个你要保存的文件
再框内输入cmd,然后回车
就能跳转到对于文件的终端;
然后,再输入一行能帮我们创建Scrapy项目的命令:
scrapy startproject douban,douban 就是Scrapy项目的名字。回车,一个Scrapy项目就创建成功了,只要一步一步来,肯定不会出错的
下载完成后,可以看到有这些文件
Scrapy项目里每个文件都有它对应的具体功能。例如:
它们对应的就是Scrapy的结构中的Item Pipeline(数据管道)。
其中最重要的是spiders是放置爬虫的目录。我们可以在spiders这个文件夹里创建爬虫文件。我们来把这个文件,命名为Book_douban_Top250。后面的大部分代码都需要在这个Book_douban_Top250.py文件里编写。
(2).Scrapy核心代码
注意!前方高能部分了,请系好安全带!勿跟丢了!
导入BeautifulSoup用于解析和提取数据; 导入scrapy是待会我们要用创建类的方式写这个爬虫,我们所创建的类将直接继承scrapy中的scrapy.Spider类。这样,有许多好用属性和方法,就能够直接使用。
接着我们开始编写爬虫的核心代码。
在Scrapy中,每个爬虫的代码结构基本都如下所示:
是不是觉得和之前自己动手写爬虫的完全不一样了呢?怎么连
requests.get()
都没有了呢?其实在框架里,我们并不需要写这一句。scrapy框架会为我们做这件事,写好请求后,接下来你就可以直接写对 response
如何做处理,我会在后面做出示例。
在上面我们已经找到了 站的规律,我们直接用for循环得到每个 址:
https://book.douban.com/top250?start=(页数-1)*25 ,代码如下:
我们只先爬取豆瓣Top250前3页的书籍信息,接下来,只要再借助DoubanSpider(scrapy.Spider)中的 parse 方法处理 response,借助 BeautifulSoup 来取出我们想要的书籍信息的数据。Let`s go
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!