前言
之前博主分享了两篇使用requests库进行网络资源的爬取,那么有没有一个通用的更加强大的爬虫方案呢?答案当然是有的,下面博主就为大家介绍一下Scrapy框架(也是业内运用最为广泛的框架)的基本使用。
Scrapy简介
- Scrapy使用纯Python实现,是一个为了爬取网站数据,提取结构性数据而编写的应用框架,其用途非常广泛,可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
- 通常我们只需要定制开发几个模块就可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。
- Scrapy也支持多线程爬取,并且用户可以自由选择是否遵循robots协议。
- Scrapy 使用了Twisted异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
Scrapy架构
Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件。
有些朋友可能没有安装Scrapy,请移步Scrapy中文官方文档。
第一个Scrapy项目
下面我们以爬取豆瓣电影排行为例。
在开始爬取之前,我们首先要创建一个scrapy项目,在命令行输入以下命令即可创建。
scrapy startproject padouban
此命令是创建名为padouban的Scrapy项目。(前面的scrapy startproject)为固定格式。
创建成功后目录结构如下:
然后我们需要cd到spiders目录下,输入以下命令,创建一个爬虫
scrapy genspider douban movie.douban.com
scrapy genspider为固定格式,douban为爬虫文件名,movie.douban.com为我们所爬取的网站的域名。
执行命令后发现spiders目录下多了一个douban.py的文件,我们便可以开始编写我们的爬虫了。
网页分析
来到豆瓣剧情排行榜页面,我们发现随着向下滑动的过程中电影不断增加,这很可能是浏览器发送了AJAX请求,分析network,选择XHR,我们发现了携带的电影信息。
知道了信息来源,我们就可以开始编写爬虫文件了。
编写程序
编写scrapy项目,我们一般需要编写四个文件。
首先编写items.py,这个文件确定的我们要爬取哪些信息。
import scrapy
class PadoubanItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
types = scrapy.Field()
regions = scrapy.Field()
movie_url = scrapy.Field()
image_url = scrapy.Field()
actors = scrapy.Field()
release_date = scrapy.Field()
修改settings.py文件
USER_AGENT = ""#这里需要填写用户代理
DOWNLOAD_DELAY = 0.5#选择请求间隔时间,这里选择0.5秒
#ROBOTSTXT_OBEY = True #是否遵循robots协议,我们需要注释掉。
ITEM_PIPELINES = {
'padouban.pipelines.PadoubanPipeline': 300,
} #启用管道,我们需要取消注释。
然后编写douban.py文件
import json
import scrapy
from padouban.items import PadoubanItem
class DoubanSpider(scrapy.Spider):
name = 'douban'
#允许爬取的域
allowed_domains = ['movie.douban.com']
#开始爬取的第一个url
start_urls = ['https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20']
offset = 0
#请求到资源后进入此函数进行解析。
def parse(self, response):
#解析拿到的json,将其转变为字典
list_data = json.loads(response.text)
#创建Item类,保持提取的字段
item = PadoubanItem()
if not list_data:
return
#提取相应的字段
for i in list_data:
item['title'] = i.get("title")
item['types'] = i.get("types")
item['regions'] = i.get("regions")
item['movie_url'] = i.get("url")
item['image_url'] = i.get("cover_url")
item['actors'] = i.get("actors")
item['release_date'] = i.get("release_date")
#此处会把item扔给管道处理,然后继续执行,不会结束函数。
yield item
self.offset = 20 + self.offset
url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={}&limit=20".format(self.offset)
#继续请求
yield scrapy.Request(url=url, callback=self.parse)
最后编写管道文件(piplines.py)
import json
class PadoubanPipeline(object):
#开始爬取时执行此方法
def open_spider(self, spider):
#打开json文件,进行写操作
self.file = open("douban.json", "w")
#每当yield item后执行此方法
def process_item(self, item, spider):
#将字典转换为json,并写入文件
content = json.dumps(dict(item), ensure_ascii = False) + '\n'
self.file.write(content)
return item
#结束爬取时执行此方法
def close_spider(self, spider):
#关闭json文件
self.file.close()
程序完成后,我们只需要命令行进入spiders目录下,然后执行命令:
scrapy crawl douban
就可以执行爬虫了。
爬取部分结果如下:
恭喜大家学习完了Scrapy框架的基本使用,希望对大家有所帮助,今天的分享就到这里了,祝大家学习进步!