为何要学 scrapy 呢?看下图,就清楚了。不少招聘要求都有 scrapy,主要是由于 scrapy 确实很强。那到底强在哪里呢?请在文中找答案。 html
首先咱们先来学习一下 scrapy 的工做流程。scrapy 文档地址 数据库
一、爬虫引擎得到初始请求开始抓取。 二、爬虫引擎开始请求调度程序,并准备对下一次的请求进行抓取。 三、爬虫调度器返回下一个请求给爬虫引擎。 四、引擎请求发送到下载器,经过下载中间件下载网络数据。 五、一旦下载器完成页面下载,将下载结果返回给爬虫引擎。 六、引擎将下载器的响应经过中间件返回给爬虫进行处理。 七、爬虫处理响应,并经过中间件返回处理后的items,以及新的请求给引擎。 八、引擎发送处理后的items到项目管道,而后把处理结果返回给调度器,调度器计划处理下一个请求抓取。 九、重复该过程(继续步骤1),直到爬取完全部的 url 请求。bash
爬虫引擎负责控制各个组件之间的数据流,当某些操做触发事件后都是经过engine来处理。网络
调度接收来engine的请求并将请求放入队列中,并经过事件返回给engine。架构
经过engine请求下载网络数据并将结果响应给engine。dom
Spider发出请求,并处理engine返回给它下载器响应数据,以items和规则内的数据请求(urls)返回给engine。scrapy
负责处理engine返回spider解析后的数据,而且将数据持久化,例如将数据存入数据库或者文件。ide
下载中间件是engine和下载器交互组件,以钩子(插件)的形式存在,能够代替接收请求、处理数据的下载以及将结果响应给engine。学习
spider中间件是engine和spider之间的交互组件,以钩子(插件)的形式存在,能够代替处理response以及返回给engine items及新的请求集。ui
pip install scrapy
复制代码
scrapy startproject doubanTop250(项目名称)
复制代码
目录架构以下,其中 douban_spider.py 为手动建立。
scrapy crawl douban(后面会解释,这个 dougban 是从哪里来的,此处先留一个小坑)
复制代码
如下代码为 douban_spider.py ,里面都有相应的注释,以方便理解
class RecruitSpider(scrapy.spiders.Spider):
# 此处为上面留下的小坑,便是设置爬虫名称
name = "douban"
# 设置容许爬取的域名
allowed_domains = ["douban.com"]
# 设置起始 url
start_urls = ["https://movie.douban.com/top250"]
# 每当网页数据 download 下来,就会发送到这里进行解析
# 而后返回一个新的连接,加入 request 队列
def parse(self, response):
item = Doubantop250Item()
selector = Selector(response)
Movies = selector.xpath('//div[@class="info"]')
for eachMovie in Movies:
title = eachMovie.xpath('div[@class="hd"]/a/span/text()').extract() # 多个span标签
fullTitle = "".join(title)
movieInfo = eachMovie.xpath('div[@class="bd"]/p/text()').extract()
star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span/text()').extract()[0]
quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()').extract()
# quote 可能为空,这里进行判断一下
if quote:
quote = quote[0]
else:
quote = ''
item['title'] = fullTitle
item['movieInfo'] = ';'.join(movieInfo)
item['star'] = star
item['quote'] = quote
yield item
nextLink = selector.xpath('//span[@class="next"]/link/@href').extract()
# 第10页是最后一页,没有下一页的连接
if nextLink:
nextLink = nextLink[0]
yield Request(urljoin(response.url, nextLink), callback=self.parse)
复制代码
每当 spider 分析完 HTML 以后,变会返回 item,传递给 item pipelines。上面代码中:
yield item
复制代码
即是返回的数据。 通常 pipelines 经常使用于:
class Doubantop250Pipeline(object):
def process_item(self, item, spider):
return item
复制代码
定义咱们须要获取的字段
class Doubantop250Item(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field() # 电影名字
movieInfo = scrapy.Field() # 电影的描述信息,包括导演、主演、电影类型等等
star = scrapy.Field() # 电影评分
quote = scrapy.Field() # 脍炙人口的一句话
pass
复制代码
settings.py 定义咱们爬虫的各类配置,因为这里是初步了解 scrapy 故相应的介绍会在后面。
scrapy crawl douban
复制代码
关于豆瓣电影的小爬虫就下完了,后面会深刻解析一下 scrapy 的高级用法。
因为其中一位中奖者没有及时领取相应的奖品,即视该中奖者放弃相应的奖品。通过查看后台的数据,我决定将这个名额给【薯条】这位读者