Scrapy使用简介_1

0x00 前言

上一篇笔记记录了学习Python爬虫的简单思路,然后就要对Python爬虫框架进行基本使用了,玩玩更健康

0x01 Scrapy基本介绍

  • 基本数据流图解:

数据流图

  • 基本数据流程:
  1. Spiders发送第一个URL给引擎
  2. 引擎从Spider中获取到第一个要爬取的URL后,在调度器(Scheduler)以Request调度
  3. 调度器把需要爬取的request返回给引擎
  4. 引擎将request通过下载中间件发给下载器(Downloader)去互联网下载数据
  5. 一旦数据下载完毕,下载器获取由互联网服务器发回来的Response,并将其通过下载中间件发送给引擎
  6. 引擎从下载器中接收到Response并通过Spider中间件发送给Spider处理
  7. Spider处理Response并从中返回匹配到的Item及(跟进的)新的Request给引擎
  8. 引擎将(Spider返回的)爬取到的Item给Item Pipeline做数据处理或者入库保存,将(Spider返回的)Request给调度器入队列
  9. (从第三步)重复直到调度器中没有更多的request
  • 简单的说:

引擎是大脑,负责在各组件中调度传递信息。我们要编写的几个主要组件就是spider,pipeline和中间件

  • 项目结构:

项目结构图

  • 编程思路:

还是以猫眼这个简单例子,这次使用了scrapy来实现,首先编写maoyan_top.py,实现爬虫主程序,也就是定义一个爬虫,然后编写items.py定义一个存储数据的数据结构,类似dict,最后编写pipelines.py实现数据存储,这就是最简单的scrapy实现思路

  • 首先编写maoyan_top.py,主要就是编写MaoyanTopSpider类,这个类继承scrapy.Spider,定义好基本URL的数据后,就是主力编写parse函数,这个函数就是负责解析数据的。注意这里我yield了item给pipelines.py处理,yield了scrapy.Request给调度器进行翻页爬取
import scrapy
from ..items import MaoyanItem


class MaoyanTopSpider(scrapy.Spider):
name = 'maoyan_top'
allowed_domains = ['maoyan.com']
base_url = "https://maoyan.com/board/4?offset="
offset = 0
start_urls = [base_url + str(offset)]

def parse(self, response):

nodelist = response.xpath("//div[@class='board-item-main']")
for node in nodelist:
item = MaoyanItem()
item['name'] = node.xpath(".//a/text()").extract()[0]
item['actors'] = node.xpath(".//p[@class='star']/text()").extract()[0].split()
integer = node.xpath(".//i[@class='integer']/text()").extract()[0]
fraction = node.xpath(".//i[@class='fraction']/text()").extract()[0]
item['score'] = integer+fraction
yield item

if self.offset < 100:
self.offset += 10
url = self.base_url+str(self.offset)
yield scrapy.Request(url,callback = self.parse)
  • 然后编写items.py定义一个存储数据的数据结构给上面的parse函数使用,非常简单我就定义了三个字段,分别为电影的名字,评分和演员
# -*- coding: utf-8 -*-

import scrapy


class MaoyanItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
actors = scrapy.Field()
score = scrapy.Field()
  • 最后编写pipelines.py进行存储数据,这里要注意parse函数yield出来的item会到达这里处理
class MaoyanPipeline(object):

def open_spider(self,spider):
print(type(spider))
print("open file")

self.f = open('/Users/Rick7/Desktop/items.json', 'w+',encoding='utf-8')

def process_item(self, item, spider):

line = json.dumps(dict(item),ensure_ascii=False) + "\n"
self.f.write(line)

return item

def close_spider(self,spider):

self.f.close()
print("close file")
  • 配置好setting文件激活管道,程序完成

0x02 总结

  • 要学scrapy首先要搞清楚这个框架的数据流
  • 建议阅读官方文档了解其中的类和方法
  • 后面还会继续学习高级一点点的知识,例如url去重,中间件的使用等

refer:

https://doc.scrapy.org/en/latest/index.html