python源码剖析 豆瓣_详解 Python爬虫中的scrapy框架(一):原理剖析以及安装教程(以爬取豆瓣电影作为详解)...

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。也是高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。目前官方最新版本是scrapy1.5。

Scratch,是抓取的意思,这个Python的爬虫框架叫Scrapy,大概也是这个意思吧,就叫它:小刮刮吧。

Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下:

Scrapy运行流程大概如下:

引擎从调度器中取出一个链接(URL)用于接下来的抓取

引擎把URL封装成一个请求(Request)传给下载器

下载器把资源下载下来,并封装成应答包(Response)

爬虫解析Response

解析出实体(Item),则交给实体管道进行进一步的处理

解析出的是链接(URL),则把URL交给调度器等待抓取

各组件的作用

Scrapy Engine

引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。

此组件相当于爬虫的“大脑”,是整个爬虫的调度中心。

调度器(Scheduler)

调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。

初始的爬取URL和后续在页面中获取的待爬取的URL将放入调度器中,等待爬取。同时调度器会自动去除重复的URL(如果特定的URL不需要去重也可以通过设置实现,如post请求的URL)

下载器(Downloader)

下载器负责获取页面数据并提供给引擎,而后提供给spider。

Spiders

Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。

Item Pipeline

Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。

当页面被爬虫解析所需的数据存入Item后,将被发送到项目管道(Pipeline),并经过几个特定的次序处理数据,最后存入本地文件或存入数据库。

下载器中间件(Downloader middlewares)

下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

通过设置下载器中间件可以实现爬虫自动更换user-agent、IP等功能。

Spider中间件(Spider middlewares)

Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

数据流(Data flow)

引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。

引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。

引擎向调度器请求下一个要爬取的URL。

调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。

一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。

引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。

Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。

引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。

(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

工具:

语言:python 3.6

IDE: Pycharm

浏览器:Chrome 71.0

爬虫框架:Scrapy 1.5

安装教程:

1.直接使用Pycharm进行安装,省去不必要的麻烦,点击File->Settings For Project。然后点击+号,搜索scrapy进行安装即可。

2.安装完成后,进入我们已经建立好的目录,在目录下面输入cmd命令。

scrapy startproject douban

3.我们用pycharm打开该项目,具体看一下:

下面来简单介绍一下各个文件的作用:

scrapy.cfg:项目的配置文件

douban/:项目的Python模块,将会从这里引用代码

douban/items.py:项目的items文件

douban/pipelines.py:项目的pipelines文件

douban/settings.py:项目的设置文件

douban/spiders/:存储爬虫的目录

好了,目录我们认识完了,在开始之前给大家一个小技巧,Scrapy默认是不能在IDE中调试的,我们在根目录中新建一个py文件叫:entrypoint.py;在里面写入以下内容:

from scrapy.cmdline import execute

execute(['scrapy', 'crawl', 'douban'])

现在整个目录看起来是这样:

建立一个项目之后:

第一件事情是在items.py文件中定义一些字段,这些字段用来临时存储你需要保存的数据。方便后面保存数据到其他地方,比如数据库 或者 本地文本之类的。

第二件事情在spiders文件夹中编写自己的爬虫

第三件事情在pipelines.py中存储自己的数据

还有一件事情,不是非做不可的,就settings.py文件 并不是一定要编辑的,只有有需要的时候才会编辑。

2.明确目标(Item)

Items

爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy spider可以以python的dict来返回提取的数据.虽然dict很方便,并且用起来也熟悉,但是其缺少结构性,容易打错字段的名字或者返回不一致的数据,尤其在具有多个spider的大项目中。

为了定义常用的输出数据,Scrapy提供了 Item 类。 Item 对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like) 的API以及用于声明可用字段的简单语法。

许多Scrapy组件使用了Item提供的额外信息: exporter根据Item声明的字段来导出数据、 序列化可以通过Item字段的元数据(metadata)来定义、 trackref 追踪Item实例来帮助寻找内存泄露 (see 使用 trackref 调试内存泄露) 等等。

Item 对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like) 的API以及用于声明可用字段的简单语法。

在Scrapy中,items是用来加载抓取内容的容器,提供了一些额外的保护减少错误。

一般来说,item可以用scrapy.item.Item类来创建,并且用scrapy.item.Field对象来定义属性。

接下来,我们开始来构建item模型(model)。

首先,我们想要的内容有:

排名(ranking)

电影名称(movie_name)

电影评分(score)

评论人数(score_num)

格言(quote)

Item使用简单的class定义语法以及Field对象来声明。我们打开scrapyspider目录下的items.py文件写入下列代码声明Item:

这样我们第一步就完成啦!是不是So Easy?ヾ(´▽‘)ノ ; 下面开始重点了哦!编写spider(就是我们用来提取数据的爬虫了):

3.制作爬虫(Spider)

制作爬虫,总体来说分为两步:先爬再取。

也就是说,首先你要获取整个网页的所有内容,然后再取出其中对你有用的部分。

要建立一个Spider,你必须用scrapy.spider.BaseSpider创建一个子类,并确定三个强制的属性:

name:爬虫的识别名称,必须是唯一的,在不同的爬虫中你必须定义不同的名字。

start_urls:爬取的URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

parse():解析的方法,调用的时候传入从每一个URL传回的Response对象作为唯一参数,负责解析并匹配抓取的数据(解析为item),跟踪更多的URL。

创建douban_spider.py文件,保存在douban\spiders目录下。并导入我们需用的模块

编写主要模块:

然后运行一下,

会看到有403错误,是因为我们爬取的时候没加头部导致的:

我们来伪装一下,在settings.py里加上USER_AGENT:

USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'

再次运行,即可看到正确结果。

4.提取网页信息

我们使用xpath语法来提取我们所需的信息。 不熟悉xpath语法的可以在W3School网站学习一下,很快就能上手,难度不高。 首先我们在chrome浏览器里进入豆瓣电影TOP250页面并按F12打开开发者工具。

我们可以看到每一部电影的信息都在一个

...

里,打开后可以找到我们想要的全部信息,其中spider中初始的request是通过调用 start_requests() 来获取的。 start_requests() 读取 start_urls 中的URL, 并以 parse 为回调函数生成 Request 。,看一下代码:

运行爬虫

在项目文件夹内打开cmd运行下列命令:

scrapy crawl douban_top250 -o douban.csv

注意此处的douban_movie_top250即为我们刚刚写的爬虫的name, 而-o douban.csv是scrapy提供的将item输出为csv格式的快捷方式,第一次输出后是乱码,这时候我们要在settings.py设置一些编码格式:

FEED_EXPORT_ENCODING = 'GBK'

另外,在python包下面exporters.py里面CsvItemExporter 类中io.TextIOWrapper添加参数newline='',取消csv的自动换行

再次运行上述命令,我们想要的信息都被下载到douban.scv文件夹里了:

通过上述的工作,我们完成了第一页的页面信息爬取,接下来我们要爬取所有页面的信息。

自动翻页

实现自动翻页一般有两种方法:

在当前页面中找到下一页的地址;

自己根据URL的变化规律构造所有页面地址。

一般情况下我们使用第一种方法,第二种方法适用于页面的下一页地址为JS加载的情况。

观察页面的网页源码后可以得到,直接拼接URL即可得到下一页的链接。

再次运行结果,打开douban.csv。是不是发现所有的影片信息都获取到了,250个一个不多一个不少,哇咔咔。

最后,最后利用Excel的筛选功能你可以筛选任意符合你要求的影片。(PS:Excel可以直接打开csv进行操作)

结尾

从写这个Scrapy爬虫框架教程以来,调试的过程中遇到过一些小问题,通过谷歌和Stack Overflow基本上都完美解决了,也通过阅读scrapy官方文档加深了对scrapy的理解。如果有什么说的不好的地方欢迎大家指正。闻道有先后,术业有专攻,大家互相学习。

源码地址:jhyscode/scrapy_doubanTop250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值